Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 3341|Odgovoriti: 0

[Vir] .NET/C# nov tip zapisa značilnosti

[Kopiraj povezavo]
Objavljeno na 2. 10. 2023 09:25:51 | | | |
Od C# 9 naprej lahko uporabite modifikator zapisa za definiranje referenčnega tipa, ki zagotavlja vgrajeno funkcionalnost za enkapsulacijo podatkov. C# 10 omogoča sintakso razreda zapisa kot sopomenko za pojasnitev referenčnih tipov in omogoča strukturi zapisa, da z enako funkcionalnostjo definira vrste vrednosti.

Primeri uporabe za snemanje v C#(ChatGPT odgovarja):

Vrsta zapisa v C# je nova funkcija, uvedena v najnovejši različici. Uporablja se lahko v številnih scenarijih, vključno, a ne omejeno na naslednje:

Nespremenljivi podatkovni objekt: Tip zapisa je nespremenljiv, kar pomeni, da ko je enkrat ustvarjen, vrednost lastnosti ni mogoče spremeniti. To jih naredi idealne za predstavitev nespremenljivih podatkovnih struktur, kot so prenosni objekti (DTO) ali nastavitve konfiguracije.
Vrednostni objekti: Tip zapisa se lahko uporabi za predstavitev vrednostnih objektov, katerih enakost je določena na podlagi njihovih atributnih vrednosti in ne referenčne ekvivalence. To jih naredi idealne za primerjavo in shranjevanje vrednostnih objektov, kot so časovna območja, koordinatne točke in podobno.
Ujemanje vzorcev: Tip zapisa se lahko uporablja skupaj z ujemanjem vzorcev, kar je bolj priročno pri delu s kompleksnimi podatkovnimi strukturami. Lahko uporabiš pattern matching za preverjanje in izločanje vrednosti atributov objekta zapisa, da lahko izvedeš ustrezno dejanje.
Nespremenljive zbirke: Tip zapisa je mogoče uporabiti z nespremenljivimi vrstami zbirk, kot so ImmutableList, ImmutableDictionary itd., za ustvarjanje objektov nespremenljive zbirke. To zagotavlja, da vsebina zbirke ni spremenjena, s čimer se izboljša zanesljivost in varnost kode.
To je le nekaj primerov uporabe za to vrsto zapisa, vi pa se lahko odločite glede na vaše specifične potrebe in strukturo kode.
Razlika med zapisom in razredom ter strukturo

Sintaksa, ki se uporablja pri deklariranju in instanciranju razreda ali strukture, je enaka kot pri beleženju operacije. Preprosto zamenjaj ključno besedo razreda z record ali uporabi record struct namesto struct. Podobno razred zapisov podpira isto sintakso za dedovanje odnosov. Razlika med zapisom in razredom je naslednja:

  • V glavnem konstruktorju lahko uporabite pozicijske parametre za ustvarjanje in instanciranje tipov z nespremenljivimi lastnostmi.
  • Metode in operatorji, ki označujejo referenčno enakost ali neenakost v razredih (npr. Object.Equals(Object) in ==), v zapisu označujejo vrednostno enakost ali neenakost.
  • Izraz z uporabo lahko uporabite za ustvarjanje kopije nespremenljivega objekta z novo vrednostjo v izbranem atributu.
  • Metoda ToString za zapis ustvari formatni niz, ki prikazuje ime tipa objekta ter imena in vrednosti vseh njegovih skupnih lastnosti.
  • Zapis je mogoče podedovati od drugega zapisa. Vendar zapisov ni mogoče dedovati od razredov, prav tako razredov ni mogoče podedovati iz zapisov.
  • Razlika med strukturo zapisa in strukturo je v tem, da prevajalnik sintetizira metode za določanje enakosti in ToString. Prevajalnik sintetizira metodo Deconstruct za strukturo zapisa položajev.


Prevajalnik sintetizira skupno lastnost, ki je namenjena samo inicializaciji, za vsak glavni parameter konstruktorja v razredu zapisa. V strukturi zapisa prevajalnik sintetizira javne lastnosti branja/pisanja. Prevajalnik ne ustvarja lastnosti za glavne konstruktorske argumente v razredih in strukturah, ki ne vsebujejo modifikatorja zapisa.

rekord

Referenčni tip razreda zapisa (privzeto: razred se lahko izpusti)
Vrsta vrednosti strukture zapisa

Record Grammar Sugar

Zapis je pravzaprav taSintaktični sladkor, končni rezultat pa je razredna ali strukturna koda。 Vzemimo naslednjo kodo kot primer:

Na koncu se prevede v naslednjo kodo:

z uporabo System;
z uporabo System.Collections.Generic;
uporaba System.Diagnostics;
z uporabo System.Reflection;
uporaba System.Runtime.CompilerServices;
uporaba System.Security;
uporaba System.Security.Permissions;
z uporabo System.Text;
z uporabo Microsoft.CodeAnalysis;

[asembler: CompilationRelaxations(8)]
[assembly: Runtime Comcombibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebugggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebugggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.DisableOptimizations)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[modul: NepreverljivaKoda]
[modul: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
javni razred PersonInfo: IEquatable<PersonInfo>
{
    [PrevajalnikGenerirano]
    [DebuggerBrowsable(DebuggerBrowsableState.Nikoli)]
    zasebni niz samo za branje <FirstName>k__BackingField;

    [PrevajalnikGenerirano]
    [DebuggerBrowsable(DebuggerBrowsableState.Nikoli)]
    zasebni niz samo za branje <LastName>k__BackingField;

    [PrevajalnikGenerirano]
    zaščiten virtualni tip enakostPogodba
    {
        [PrevajalnikGenerirano]
        dobiti
        {
            return typeof(PersonInfo);
        }
    }

    javni string FirstName
    {
        [PrevajalnikGenerirano]
        dobiti
        {
            vrnitev <FirstName>k__BackingField;
        }
        [PrevajalnikGenerirano]
        Init
        {
            <FirstName>k__BackingField = vrednost;
        }
    }

    javni string LastName
    {
        [PrevajalnikGenerirano]
        dobiti
        {
            vrnitev <LastName>k__BackingField;
        }
        [PrevajalnikGenerirano]
        Init
        {
            <LastName>k__BackingField = vrednost;
        }
    }

    public PersonInfo(niz FirstName, string LastName)
    {
        <FirstName>k__BackingField = Ime;
        <LastName>k__BackingField = Priimek;
        baza.. ctor();
    }

    [PrevajalnikGenerirano]
    javni preglasitveni niz ToString()
    {
        StringBuilder stringBuilder = novi StringBuilder();
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        if (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        return stringBuilder.ToString();
    }

    [PrevajalnikGenerirano]
    zaščiteni virtualni bool PrintMembers (graditelj StringBuilderja)
    {
        RuntimeHelpers.EnsureSufficientExecutionStack();
        stavbenik. Dodajmo("FirstName = ");
        stavbenik. Append((object)FirstName);
        stavbenik. Dodajmo(", PriimekIme = ");
        stavbenik. Dodaj((object)LastName);
        vrni true;
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [PrevajalnikGenerirano]
    javni statični bool operator !=(PersonInfo levo, PersonInfo desno)
    {
        vrnitev! (levo == desno);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [PrevajalnikGenerirano]
    javni statični bool operator ==(PersonInfo levo, PersonInfo desno)
    {
        return (object)left == right || ((object)left != null & left. Equals (desno));
    }

    [PrevajalnikGenerirano]
    public override int GetHashCode()
    {
        return (EqualityComparer<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)]
    [PrevajalnikGenerirano]
    public override bool Equals (object obj)
    {
        vrni Equals(obj kot PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [PrevajalnikGenerirano]
    javni virtualni bool Equals (PersonInfo other)
    {
        return (object)this == other || ((object)other != null && EqualityContract == other. EqualityContract & EqualityComparer<string>. Default.Equals(<FirstName>k__BackingField, other.<FirstName>k__BackingField) & EqualityComparer<string>. Default.Equals(<LastName>k__BackingField, other.<LastName>k__BackingField));
    }

    [PrevajalnikGenerirano]
    javni virtualni PersonInfo <Clone>$()
    {
        vrni novo PersonInfo(to);
    }

    [PrevajalnikGenerirano]
    zaščitena osebaInformacije (izvirni PersonInfo)
    {
        <FirstName>k__BackingField = izvirno. <FirstName>k__BackingField;
        <LastName>k__BackingField = izvirno. <LastName>k__BackingField;
    }

    [PrevajalnikGenerirano]
    public void Deconstruct(out string FirstName, out string LastName)
    {
        ImeIme = to. Ime;
        Priimek = to. Priimek;
    }
}

imenski prostor Microsoft.CodeAnalysis
{
    [PrevajalnikGenerirano]
    [Vgrajeno]
    notranji zapečateni razred EmbeddedAttribute : Attribute
    {
    }
}

imenski prostor System.Runtime.CompilerServices
{
    [PrevajalnikGenerirano]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
    notranji zapečateni razred NullableAttribute : Attribute
    {
        javni readonly bajt[] NullableFlags;

        public NullableAttribute(byte P_0)
        {
            bajt[] polje = nov bajt[1];
            array[0] = P_0;
            NullableFlags = polje;
        }

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

    [PrevajalnikGenerirano]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
    notranji zapečateni razred NullableContextAttribute : Attribute
    {
        javni bajt Flag;

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

    [PrevajalnikGenerirano]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
    notranji zapečateni razred RefSafetyRulesAttribute : Attribute
    {
        javno berljivo samo v različici;

        javni RefSafetyRulesAttribute(int P_0)
        {
            Različica = P_0;
        }
    }
}
Samodejno generira konstruktorje, prepiše metode ToString, GetHashCode, Equals in samodejno generira nekatere metode.


p1 in p2 sta pravzaprav dva različna objekta, vendar je prevajalnik samodejno generiral primerjalnik (IEquatable) in prepisal metode Equals in GetHashCode, zato je bil izhod resničen. Klicanje metode ToString je prav tako zelo intuitivno za izpis zabeležene vrednosti. Kot je prikazano spodaj:

.NET/C# implementira IEqualityComparer prilagojeni primerjalnik
https://www.itsvse.com/thread-10643-1-1.html



rekord

Zahteva:required modifikator označuje, da mora polje ali atribut, ki ga uporablja, inicializirati vsi konstruktorji ali z uporabo inicializatorja objektov. Vsak izraz, ki se uporablja za inicializacijo nove instance te vrste, mora inicializirati vse potrebne člane.
Referenčni:Prijava do hiperpovezave je vidna.

Init: V C# 9 in kasnejših ključna beseda init določa metodo accessorja v lastnosti ali indekserju. Knjižnica, ki je samo INIT, dodeli vrednosti le atributom ali elementom indeksatorja med gradnjo objektov. To zagotavlja nespremenljivost, tako da ko je objekt enkrat inicializiran, ga ni več mogoče spreminjati.
Referenčni:Prijava do hiperpovezave je vidna.

s: Če morate ponoviti instanco z nekaterimi spremembami, lahko uporabite izraz with za izvedbo nedestruktivnih sprememb. z izrazom za ustvarjanje nove instance zapisa, ki je kopija obstoječe instance zapisa, s spremembo določenih lastnosti in polj.
Referenčni:Prijava do hiperpovezave je vidna.

Torej je zapis mogoče definirati takole:

potreben, init, da ne omenjam, da je pravzaprav sintaktični sladkor, boPokličimo <Clone>samodejno generirano metodo $in nato spremeni vrednost atributa. Kot sledi:



Koda:



Atribut rekorda

Včasih moramo atributom dodati nekatere funkcije, kot so funkcije serializacije JSON, opisne informacije itd.



Sredstva:

Prijava do hiperpovezave je vidna.
Prijava do hiperpovezave je vidna.





Prejšnji:ASP.NET Core (24) temelji na visokozmogljivi komunikaciji Refit, MemoryPack
Naslednji:GitHub uporablja REST API za prikaz velikosti repozitorijev
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com