See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 3501|Vastuse: 0

[Allikas] .NET/C# uus funktsioonikirje tüüp

[Kopeeri link]
Postitatud 02.10.2023 09:25:51 | | | |
Alates C# 9-st saad kasutada kirje modifikaatorit, et määratleda viitetüüp, mis pakub sisseehitatud funktsionaalsust andmete kapseldamiseks. C# 10 võimaldab kirjeklassi süntaksil viitetüüpide täpsustamiseks ning võimaldab kirje struktuuril määratleda väärtustüüpe sama funktsionaalsusega.

Kasutusjuhtumid C# salvestuse jaoks(ChatGPT vastab):

Plaaditüüp C#-s on uus funktsioon, mis tutvustati viimases versioonis. Seda saab kasutada paljudes olukordades, sealhulgas, kuid mitte ainult, järgmistes:

Muutmatu andmeobjekt: Kirjetüüp on muutumatu, mis tähendab, et pärast loomist ei saa selle omadusväärtust muuta. See teeb neist ideaalsed muutmatute andmestruktuuride, nagu ülekandeobjektid (DTO-d) või konfiguratsiooniseaded, esindamiseks.
Väärtusobjektid: Kirje tüüpi saab kasutada väärtusobjektide esindamiseks, mille võrdus määratakse nende atribuudi väärtuste põhjal, mitte viiteekvivalentsuse alusel. See teeb neist ideaalsed väärtusobjektide, nagu kuupäevavahemikud, koordinaatpunktid ja muu võrdlemiseks ja salvestamiseks.
Mustri sobitamine: Kirje tüüpi saab kasutada koos mustrite sobitamisega, mis teeb selle mugavamaks keerukate andmestruktuuridega töötamisel. Saad kasutada mustrite sobitamist, et kontrollida ja välja võtta kirjeobjekti atribuudi väärtused, et sooritada vastav tegevus.
Muutmatud kogud: Kirjetüüpi saab kasutada muutumatute kogutüüpidega nagu ImmutableList, ImmutableDictionary jne, et luua muutumatuid koguobjekte. See tagab, et kogu sisu ei muutu, parandades seeläbi koodi töökindlust ja turvalisust.
Need on vaid mõned kirjetüübi kasutusjuhtumid ning saate otsustada, kas kasutada kirjetüüpi vastavalt oma konkreetsetele vajadustele ja koodistruktuurile.
Erinevus kirje, klassi ja struktuuri vahel

Klassi või struktuuri deklareerimisel ja instantsimisel kasutatav süntaks on sama, mis operatsiooni salvestamisel. Lihtsalt asenda klassi märksõna kirjega või kasuta strukturi asemel kirje struct. Samamoodi toetab kirjeklass sama süntaksit pärimissuhete jaoks. Erinevus kirje ja klassi vahel on järgmine:

  • Peakonstruktoris saab kasutada positsiooniparameetreid, et luua ja instantsieerida tüüpe, millel on muutumatud omadused.
  • Meetodid ja operaatorid, mis viitavad klassides viite võrdsusele või mittevõrdsusele (nt Object.Equals(Object) ja ==), näitavad kirjes väärtuslikku võrdsust või mittevõrdsust.
  • Sa saad kasutada with avaldist, et luua koopia muutumatust objektist, millel on valitud atribuudis uus väärtus.
  • Kirje ToString meetod loob vormingustringi, mis kuvab objekti tüübinime ning kõigi selle ühiste omaduste nimed ja väärtused.
  • Kirje võib pärida teiselt kirjelt. Kuid kirjeid ei saa pärida klassidelt ega klassid kirjetelt.
  • Erinevus kirjestruktuuri ja struktuuri vahel seisneb selles, et kompilaator sünteesib meetodeid võrdsuse ja ToStringi määramiseks. Kompilaator sünteesib Deconstruct meetodi positsioonikirje struktuuri jaoks.


Kompilaator sünteesib iga peamise konstruktori parameetri jaoks kirjeklassis ühise ainult inisialiseerimise omaduse. Kirjestruktuuris sünteesib kompilaator avalikke lugemis-/kirjutamisomadusi. Komilaator ei loo peamiste konstruktorargumentide omadusi klassi- ja struktuuritüüpides, mis ei sisalda kirje modifikaatorit.

rekord

kirjeklassi viitetüüp (vaikimisi: klass võib välja jätta)
Kirje struktuuri väärtuse tüüp

Grammatika Sugar rekord

Rekord on tegelikult see,Süntaksi suhkur ja lõpptulemus on klassi- või struktuurkood。 Võtame näiteks järgmise koodi:

Lõpuks kompileeritakse see järgmiseks koodiks:

kasutades süsteemi;
kasutades System.Collections.Generic;
kasutades System.Diagnostics;
kasutades System.Reflection'i;
kasutades System.Runtime.CompilerServices;
kasutades System.Securityt;
kasutades System.Security.Permissions;
kasutades System.Texti;
kasutades Microsoft.CodeAnalysis'i;

[assembler: CompilationRelaxs(8)]
[assembler: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebugggingModes.DisableOptimizations)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[moodul: UnverifiableCode]
[moodul: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
avalik klass IsikInfo: IEquatable<PersonInfo>
{
    [KompilaatorGenereeritud]
    [SilurBrowsable(SilurBrowsableState.Mitte kunagi)]
    privaatne ainult <FirstName>lugemisjada k__BackingField;

    [KompilaatorGenereeritud]
    [SilurBrowsable(SilurBrowsableState.Mitte kunagi)]
    privaatne ainult lugemiseks <LastName>mõeldud string k__BackingField;

    [KompilaatorGenereeritud]
    kaitstud virtuaalne tüüp EqualityContract
    {
        [KompilaatorGenereeritud]
        Saada
        {
            return typeof(PersonInfo);
        }
    }

    public string FirstName
    {
        [KompilaatorGenereeritud]
        Saada
        {
            Tagasi <FirstName>k__BackingField;
        }
        [KompilaatorGenereeritud]
        Init
        {
            <FirstName>k__BackingField = väärtus;
        }
    }

    avalik string Perekonnanimi
    {
        [KompilaatorGenereeritud]
        Saada
        {
            Tagasi <LastName>k__BackingField;
        }
        [KompilaatorGenereeritud]
        Init
        {
            <LastName>k__BackingField = väärtus;
        }
    }

    public PersonInfo (string FirstName, string FamilyName)
    {
        <FirstName>k__BackingField = Eesnimi;
        <LastName>k__BackingField = Perekonnanimi;
        alus.. ctor();
    }

    [KompilaatorGenereeritud]
    public override string ToString()
    {
        StringBuilder stringBuilder = uus StringBuilder();
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        if (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        return stringBuilder.ToString();
    }

    [KompilaatorGenereeritud]
    kaitstud virtuaalne bool PrintMembers (StringBuilder builder)
    {
        RuntimeHelpers.EnsureEnoughExecutionStack();
        ehitaja. Append("Eesnimi = ");
        ehitaja. Append((objekt)Eesnimi);
        ehitaja. Append(", perekonnanimi = ");
        ehitaja. Append((objekt)Perekonnanimi);
        return true;
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [KompilaatorGenereeritud]
    avalik staatiline bool operaator !=(PersonInfo vasakul, PersonInfo paremal)
    {
        Tagasi! (vasak == parem);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [KompilaatorGenereeritud]
    public static bool operaator ==(PersonInfo vasakul, PersonInfo paremal)
    {
        return (objekt)vasak == parem || ((objekt)left != null && left. Võrdne (paremal));
    }

    [KompilaatorGenereeritud]
    public override int GetHashCode()
    {
        return (Võrdsusvõrdleja<Type>. Default.GetHashCode(EqualityContract) * -1521134295 + EqualityComparer<string>. Default.GetHashCode(<FirstName>k__BackingField)) * -1521134295 + EqualityComparer<string>. Default.GetHashCode(<LastName>k__BackingField);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [KompilaatorGenereeritud]
    public override bool Võrdub (objekt obj)
    {
        return Equals (obj kui PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [KompilaatorGenereeritud]
    public virtual bool võrdub (PersonInfo muu)
    {
        return (object)this == other || ((objekt)other != null && EqualityContract == muu. Võrdsusleping & võrdleja<string>. Vaikimisi. Võrdub(<FirstName>k__BackingField, muu.<FirstName>k__BackingField) && Võrdsuse <string>võrdleja. Vaikimisi. Võrdub(<LastName>k__BackingField, muu.<LastName>k__BackingField));
    }

    [KompilaatorGenereeritud]
    avalik virtuaalne PersonInfo <Clone>$()
    {
        tagasta uus PersonInfo (see);
    }

    [KompilaatorGenereeritud]
    kaitstud PersonInfo (PersonInfo originaal)
    {
        <FirstName>k__BackingField = originaal. <FirstName>k__BackingField;
        <LastName>k__BackingField = originaalne. <LastName>k__BackingField;
    }

    [KompilaatorGenereeritud]
    public void Deconstruct (out string FirstName, out string LastName)
    {
        Eesnimi = see. Eesnimi;
        Perekonnanimi = see. Perekonnanimi;
    }
}

namespace Microsoft.CodeAnalysis
{
    [KompilaatorGenereeritud]
    [Sisse ehitatud]
    sisemine suletud klass EmbeddedAttribute : atribuut
    {
    }
}

Nimeruum System.Runtime.CompilerServices
{
    [KompilaatorGenereeritud]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Väli | AttributeTargets.Event | AttributeTargets.Parameeter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = vale, Päritud = vale)]
    sisemine suletud klass NullableAttribute : Atribuut
    {
        avalik loetav bait[] NullableFlags;

        public NullableAttribute(byte P_0)
        {
            byte[] massiivi = uus bait[1];
            array[0] = P_0;
            NullableFlags = massiiv;
        }

        public NullableAttribute(bait[] P_0)
        {
            NullableFlags = P_0;
        }
    }

    [KompilaatorGenereeritud]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Meetod | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = vale, Päritud = vale)]
    sisemine suletud klass NullableContextAttribute : atribuut
    {
        avalik lugemispõhine bait Flag;

        public NullableContextAttribute(byte P_0)
        {
            Lipp = P_0;
        }
    }

    [KompilaatorGenereeritud]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = vale, päritud = vale)]
    sisemine suletud klass RefSafetyRulesAttribute : Atribuut
    {
        avalik ainult lugemiseks int versioon;

        public RefSafetyRulesAttribute(int P_0)
        {
            Versioon = P_0;
        }
    }
}
See genereerib automaatselt konstruktorid, kirjutab ümber ToStringi, GetHashCode'i, Equals meetodeid ja genereerib automaatselt mõningaid meetodeid.


p1 ja p2 on tegelikult kaks erinevat objekti, kuid kuna kompilaator genereeris automaatselt võrdleja (IEquatable) ja kirjutas Equals ja GetHashCode meetodid ümber, oli väljund tõene. ToString meetodi kutsumine on samuti väga intuitiivne, et salvestatud väärtus välja anda. Nagu allpool näidatud:

.NET/C# rakendab IEqualityCompareri kohandatud võrdlejat
https://www.itsvse.com/thread-10643-1-1.html



rekord

Nõutav:required modifikaator näitab, et väli või atribuut, mida see rakendab, peab olema initsialiseeritud kõigi konstruktorite või objekti initsialisaatori poolt. Iga avaldis, mida kasutatakse selle tüübi uue eksemplari initsialiseerimiseks, peab initsialiseerima kõik vajalikud liikmed.
Viide:Hüperlingi sisselogimine on nähtav.

Init: C# 9 ja hiljem määrab init märksõna accessor-meetodi omaduses või indekseerijas. Ainult init-teek määrab väärtusi atribuutidele või indekseerijatele ainult objekti loomise ajal. See tagab muutumatuse, nii et kui objekt on initsialiseeritud, ei saa seda enam muuta.
Viide:Hüperlingi sisselogimine on nähtav.

koos: Kui vajad eksemplari replitseerimist mõningate muudatustega, saad kasutada with-väljendit mitte-hävitavate muudatuste rakendamiseks. avaldisega, et luua uus kirje eksemplar, mis on olemasoleva kirje eksemplari koopia, muutes määratud omadusi ja välju.
Viide:Hüperlingi sisselogimine on nähtav.

Seega saab kirje defineerida järgmiselt:

vajalik, init, rääkimata sellest, et tegelikult on süntaks sugar, siis see teebKutsu automaatselt genereeritud <Clone>$ meetoditja seejärel muuta atribuudi väärtust. Järgmiselt:



Kood:



Rekordi omadus

Mõnikord tuleb atribuutidele lisada mõningaid omadusi, nagu JSON-i serialiseerimise funktsioonid, kirjeldusteave jne.



Ressursse:

Hüperlingi sisselogimine on nähtav.
Hüperlingi sisselogimine on nähtav.





Eelmine:ASP.NET Core (24) põhineb Refit'il, MemoryPack kõrgtasemel kommunikatsioonil
Järgmine:GitHub kasutab REST API-d hoidla suuruste vaatamiseks
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com