Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 3341|Răspunde: 0

[Sursă] .NET/C# noul tip de înregistrare de funcționalitate

[Copiază linkul]
Postat pe 02.10.2023 09:25:51 | | | |
Începând cu C# 9, poți folosi modificatorul de înregistrare pentru a defini un tip de referință care oferă funcționalitate integrată pentru încapsularea datelor. C# 10 permite sintaxa clasei de înregistrare ca sinonim pentru clarificarea tipurilor de referință și permite structurii de înregistrare să definească tipuri de valori folosind aceeași funcționalitate.

Cazuri de utilizare pentru înregistrare în C#(Răspunde ChatGPT):

Tipul de înregistrare în C# este o funcționalitate nouă introdusă în cea mai recentă versiune. Poate fi folosit în multe scenarii, inclusiv, dar fără a se limita la:

Obiect de date imuabil: Tipul de înregistrare este imuabil, ceea ce înseamnă că, odată creat, valoarea proprietății sale nu poate fi modificată. Acest lucru le face ideale pentru reprezentarea unor structuri de date imuabile, cum ar fi obiectele de transfer (DTO) sau setările de configurare.
Obiecte de valoare: Tipul de înregistrare poate fi folosit pentru a reprezenta obiecte de valoare a căror egalitate este determinată pe baza valorilor lor de atribute, nu de echivalența de referință. Acest lucru le face ideale pentru compararea și stocarea obiectelor de valoare precum intervale de date, puncte de coordonate și altele.
Potrivirea tiparului: Tipul de înregistrare poate fi folosit împreună cu potrivirea tiparelor, ceea ce îl face mai convenabil la lucrul cu structuri de date complexe. Poți folosi compararea tiparelor pentru a verifica și extrage valorile atributelor obiectului record, astfel încât să poți efectua acțiunea corespunzătoare.
Colecții Imutable: Tipul de înregistrare poate fi folosit împreună cu tipuri de colecții imutable precum ImmutableList, ImmutableDictionary etc., pentru a crea obiecte de colecție imuabile. Acest lucru asigură că conținutul colecției nu este modificat, îmbunătățind astfel fiabilitatea și securitatea codului.
Acestea sunt doar câteva dintre cazurile de utilizare ale tipului de înregistrare, iar tu poți decide dacă să folosești tipul de înregistrare în funcție de nevoile tale specifice și de structura codului.
Diferența dintre disc și clasă și structură

Sintaxa folosită la declararea și instanțierea unei clase sau structuri este aceeași ca la înregistrarea unei operații. Pur și simplu înlocuiește cuvântul cheie al clasei cu record sau folosește record struct în loc de struct. În mod similar, clasa de înregistrare susține aceeași sintaxă pentru relațiile de moștenire. Diferența dintre o înregistrare și o clasă este următoarea:

  • Poți folosi parametri de poziție în constructorul principal pentru a crea și instanția tipuri cu proprietăți imuabile.
  • Metodele și operatorii care indică egalitate sau neegalitate de referință în clase (de exemplu, Object.Egal(Obiect) și ==) indică egalitate sau neegalitate de valoare în înregistrare.
  • Poți folosi expresia with pentru a crea o copie a unui obiect imuabil cu o valoare nouă în atributul selectat.
  • Metoda ToString a înregistrării creează un șir de format care afișează numele tipului obiectului și numele și valorile tuturor proprietăților sale comune.
  • O înregistrare poate fi moștenită de la o altă înregistrare. Dar înregistrările nu pot fi moștenite de la clase, nici clasele nu pot fi moștenite din înregistrări.
  • Diferența dintre structura de înregistrare și structura este că compilatorul sintetizează metode pentru a determina egalitatea și ToString. Compilatorul sintetizează metoda Deconstruct pentru structura înregistrărilor de poziție.


Compilatorul sintetizează o proprietate comună de doar inițializare pentru fiecare parametru principal constructor din clasa de înregistrare. Într-un record struct, compilatorul sintetizează proprietăți publice de citire/scriere. Compilatorul nu creează proprietăți pentru principalele argumente ale constructorului în tipurile de clasă și structură care nu conțin modificatorul de înregistrare.

disc

Tip referință de clasă a înregistrărilor (implicit: clasa poate fi omisă)
Tipul valorii struct-ului de înregistrare

Zahărul gramatical înregistrat

Recordul este de fapt căZahăr sintaxic, iar rezultatul final este codul de clasă sau struct。 Luați următorul cod ca exemplu:

În final, se compilează în următorul cod:

folosind Sistem;
folosind System.Collections.Generic;
folosind System.Diagnostics;
folosind System.Reflection;
folosind System.Runtime.CompilerServices;
folosind System.Security;
folosind System.Security.Permissions;
folosind System.Text;
folosind Microsoft.CodeAnalysis;

[asamblare: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditandContinue | DebuggableAttribute.DebuggingModes.DisableOptimizations)]
[asamblare: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[asamblare: AssemblyVersion("0.0.0.0")]
[modul: Cod Neverificabil]
[modul: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
Clasa publică PersonInfo : IEquatable<PersonInfo>
{
    [CompilatorGenerat]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    șirul privat de citire <FirstName>k__BackingField;

    [CompilatorGenerat]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    șirul privat de citire <LastName>doar k__BackingField;

    [CompilatorGenerat]
    Contractul de Egalitate de Tip Virtual protejat
    {
        [CompilatorGenerat]
        obține
        {
            return typeof(PersonInfo);
        }
    }

    Șirul public Nume
    {
        [CompilatorGenerat]
        obține
        {
            <FirstName>întoarcerea k__BackingField;
        }
        [CompilatorGenerat]
        Init
        {
            <FirstName>k__BackingField = valoare;
        }
    }

    șirul public Nume de familie
    {
        [CompilatorGenerat]
        obține
        {
            <LastName>întoarcerea k__BackingField;
        }
        [CompilatorGenerat]
        Init
        {
            <LastName>k__BackingField = valoare;
        }
    }

    public PersonInfo(șir Nume, șir NumePrenume)
    {
        <FirstName>k__BackingField = Prenume;
        <LastName>k__BackingField = NumeDeFamilie;
        bază.. ctor();
    }

    [CompilatorGenerat]
    șirul de suprascriere publică ToString()
    {
        StringBuilder stringBuilder = noul StringBuilder();
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        dacă (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        return stringBuilder.ToString();
    }

    [CompilatorGenerat]
    PrintMembers virtuali protejați (StringBuilder builder)
    {
        RuntimeHelpers.EnsureSufficientExecutionStack();
        constructor. Anexă("Prenume = ");
        constructor. Adaugă((obiect)Nume);
        constructor. Adaugă(", Nume de Familie = ");
        constructor. Adaugă((obiect)NumeNume);
        întoarcerea cu adevărat;
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [CompilatorGenerat]
    operator static public !=(PersonInfo stânga, PersoanaInfo dreapta)
    {
        restitui! (stânga == dreapta);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [CompilatorGenerat]
    operator bool static public ==(PersonInfo stânga, PersonaInfo dreapta)
    {
        return (obiect)left == dreapta || ((obiect)left != null && left. Egal (dreapta));
    }

    [CompilatorGenerat]
    public override int GetHashCode()
    {
        return (EqualityComparer<Type>. Implicit.GetHashCode(EqualityContract) * -1521134295 + <string>EqualityComparer. Default.GetHashCode(<FirstName>k__BackingField)) * -1521134295 + <string>EqualityComparer. Implicit.GetHashCode(<LastName>k__BackingField);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [CompilatorGenerat]
    public override bool Egal (obiect obj)
    {
        return Egal (obj ca PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [CompilatorGenerat]
    public virtual bool egal (PersonInfo altul)
    {
        return (obiect)this == altele || ((obiect)alt != nul && EqualityContract == altceva. EqualityContract & <string>EqualityComparer. Implicit. Egal cu <FirstName>(k__BackingField, alt.<FirstName>k__BackingField) & <string>EqualityComparer. Implicit. Egal <LastName>k__BackingField, alt.<LastName>k__BackingField));
    }

    [CompilatorGenerat]
    public, virtual, PersonInfo <Clone>$()
    {
        return new PersonInfo(this);
    }

    [CompilatorGenerat]
    PersonInfo protejat (PersonInfo original)
    {
        <FirstName>k__BackingField = original. <FirstName>k__BackingField;
        <LastName>k__BackingField = original. <LastName>k__BackingField;
    }

    [CompilatorGenerat]
    public void Deconstruct(string out FirstName, out string NumeFamilie)
    {
        Prenume = asta. Prenume;
        Nume de Familie = asta. NumeDe Familie;
    }
}

Spațiul de nume Microsoft.CodeAnalysis
{
    [CompilatorGenerat]
    [Încorporat]
    clasa sigilată internă EmbeddedAttribute : Attribute
    {
    }
}

Spațiul de nume System.Runtime.CompilerServices
{
    [CompilatorGenerat]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
    clasa sigilată internă NullableAttribute : Attribute
    {
        octet public doar pentru citire[] NullableFlags;

        public NullableAttribute(byte P_0)
        {
            octet[] tablă = octet nou[1];
            array[0] = P_0;
            NullableFlags = tablou;
        }

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

    [CompilatorGenerat]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
    clasa sigilată internă NullableContextAtribut : Atribut
    {
        Byte public doar pentru citire Flag;

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

    [CompilatorGenerat]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
    clasă sigilată internă RefSafetyRulesAtribut : Atribut
    {
        versiune publică readonly int;

        public RefSafetyRulesAttribute(int P_0)
        {
            Versiunea = P_0;
        }
    }
}
Generează automat constructori, rescrie metodele ToString, GetHashCode, Egal și generează automat unele metode.


p1 și p2 sunt de fapt două obiecte diferite, dar deoarece compilatorul a generat automat comparatorul (IEquatable) și a rescris metodele Equals și GetHashCode, rezultatul a fost adevărat. Apelarea metodei ToString este, de asemenea, foarte intuitivă pentru a genera valoarea înregistrată. Așa cum se arată mai jos:

.NET/C# implementează comparatorul personalizat IEqualityComparer
https://www.itsvse.com/thread-10643-1-1.html



disc

necesarmodificatorul :required indică faptul că câmpul sau atributul pe care îl aplică trebuie inițializat de toți constructorii sau folosind inițializatorul de obiecte. Orice expresie folosită pentru a inițializa o nouă instanță de acest tip trebuie să inițializeze toți membrii necesari.
Referință:Autentificarea cu hyperlink este vizibilă.

Init: În C# 9 și mai târziu, cuvântul cheie init definește metoda accesorului într-o proprietate sau indexator. Biblioteca doar init atribuie valori doar atributelor sau elementelor indexatorului în timpul construcției obiectelor. Aceasta impune imuabilitatea, astfel încât odată ce un obiect este inițializat, acesta nu mai poate fi modificat.
Referință:Autentificarea cu hyperlink este vizibilă.

cu: Dacă trebuie să replici o instanță cu unele modificări, poți folosi expresia cu pentru a implementa modificări nedistructive. cu expresie pentru a crea o nouă instanță de înregistrare care este o copie a unei instanțe de înregistrare existente, modificând proprietățile și câmpurile specificate.
Referință:Autentificarea cu hyperlink este vizibilă.

Așadar, înregistrarea poate fi definită astfel:

necesar, init, ca să nu mai vorbim, cu de fapt zahăr sintaxic, vaApelați <Clone>metoda $ generată automatși apoi modifică valoarea atributului. Așa cum urmează:



Cod:



Atributul recordului

Uneori trebuie să adăugăm anumite caracteristici atributelor, cum ar fi caracteristici de serializare JSON, informații de descriere etc.



Resurse:

Autentificarea cu hyperlink este vizibilă.
Autentificarea cu hyperlink este vizibilă.





Precedent:ASP.NET Core (24) se bazează pe Refit și comunicare de înaltă performanță MemoryPack
Următor:GitHub folosește API-ul REST pentru a vizualiza dimensiunile depozitelor
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com