Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 3341|Antwort: 0

[Quelle] .NET/C# neuer Feature-Datensatz

[Link kopieren]
Veröffentlicht am 02.10.2023 09:25:51 | | | |
Ab C# 9 können Sie den Datensatzmodifikator verwenden, um einen Referenztyp zu definieren, der eine integrierte Funktionalität zur Kapselung von Daten bietet. C# 10 erlaubt die Syntax der Datensatzklassen als Synonym, um Referenztypen zu verdeutlichen, und erlaubt es der Datensatzstruktur, Werttypen mit derselben Funktionalität zu definieren.

Anwendungsfälle für die Aufzeichnung in C#(ChatGPT antwortet):

Der Datensatztyp in C# ist eine neue Funktion, die in der neuesten Version eingeführt wurde. Sie kann in vielen Szenarien verwendet werden, darunter, aber nicht beschränkt auf die folgenden:

Unveränderliches Datenobjekt: Der Datensatztyp ist unveränderlich, das heißt, nach der Erstellung kann sein Eigenschaftswert nicht mehr geändert werden. Dies macht sie ideal zur Darstellung unveränderlicher Datenstrukturen wie Transferobjekte (DTOs) oder Konfigurationseinstellungen.
Wertobjekte: Der Datensatztyp kann verwendet werden, um Wertobjekte darzustellen, deren Gleichheit anhand ihrer Attributwerte und nicht durch Referenzäquivalenz bestimmt wird. Das macht sie ideal, um Wertobjekte wie Datumsbereiche, Koordinatenpunkte und mehr zu vergleichen und zu speichern.
Mustererkennung: Der Datensatztyp kann zusammen mit Mustererkennung verwendet werden, was es bei der Arbeit mit komplexen Datenstrukturen bequemer macht. Sie können Mustererkennung verwenden, um die Attributwerte des Datensatzobjekts zu überprüfen und zu extrahieren, damit Sie die entsprechende Aktion ausführen können.
Unveränderliche Sammlungen: Der Datensatztyp kann mit unveränderlichen Sammlungstypen wie ImmutableList, ImmutableDictionary usw. verwendet werden, um unveränderliche Sammlungsobjekte zu erstellen. Dies stellt sicher, dass der Inhalt der Sammlung nicht verändert wird, wodurch die Zuverlässigkeit und Sicherheit des Codes verbessert werden.
Dies sind nur einige der Anwendungsfälle für den Datensatztyp, und Sie können entscheiden, ob Sie den Datensatztyp basierend auf Ihren spezifischen Anforderungen und Ihrer Codestruktur verwenden.
Unterschied zwischen Datensatz, Klasse und Struktur

Die Syntax, die beim Deklarieren und Instanzieren einer Klasse oder Struktur verwendet wird, ist dieselbe wie beim Aufzeichnen einer Operation. Ersetze einfach das Klassenstichwort durch Datensatz oder benutze Datensatzstruktur statt Struktur. Ähnlich unterstützt die Datensatzklasse dieselbe Syntax für Vererbungsbeziehungen. Der Unterschied zwischen einem Rekord und einer Klasse ist wie folgt:

  • Man kann Positionsparameter im Hauptkonstruktor verwenden, um Typen mit unveränderlichen Eigenschaften zu erstellen und zu instanziieren.
  • Methoden und Operatoren, die Referenzgleichheit oder Nicht-Gleichheit in Klassen anzeigen (z. B. Objekt.Gleich(Objekt) und ==) geben im Datensatz Wertgleichheit oder Nichtgleichheit an.
  • Du kannst den Ausdruck with verwenden, um eine Kopie eines unveränderlichen Objekts mit einem neuen Wert im ausgewählten Attribut zu erstellen.
  • Die ToString-Methode des Datensatzes erstellt eine Formatzeichenkette, die den Typnamen des Objekts sowie die Namen und Werte aller gemeinsamen Eigenschaften darstellt.
  • Ein Datensatz kann von einem anderen Datensatz geerbt werden. Aber Datensätze können nicht von Klassen geerbt werden, ebenso wenig können Klassen von Datensätzen übernommen werden.
  • Der Unterschied zwischen der Datensatzstruktur und der Struktur besteht darin, dass der Compiler Methoden synthetisiert, um Gleichheit und ToString zu bestimmen. Der Compiler synthetisiert die Deconstruct-Methode für die Positionsdatensatzstruktur.


Der Compiler synthetisiert eine gemeinsame Initialisierungseigenschaft für jeden Hauptkonstruktorparameter in der Datensatzklasse. In einer Datensatzstruktur synthetisiert der Compiler öffentliche Lese-/Schreibeigenschaften. Der Compiler erstellt keine Eigenschaften für die Hauptkonstruktorargumente in Klassen- und Strukturtypen, die keinen Datensatzmodifikator enthalten.

Aufzeichnung

Referenztyp der Datensatzklasse (Standard: Klasse kann weggelassen werden)
Datensatz-Strukturwerttyp

Rekordgrammatik, Zucker

Der Bericht ist tatsächlich, dassSyntax-Zucker, und das Endergebnis ist Klassen- oder Strukturcode。 Nehmen wir folgenden Code als Beispiel:

Schließlich kompiliert er zu folgendem Code:

mit System;
mit System.Collections.Generic;
mit System.Diagnostics;
mit System.Reflection;
unter Verwendung von System.Runtime.CompilerServices;
mit System.Security;
Verwendung von System.Security.Permissions;
mit System.Text;
mit Microsoft.CodeAnalysis;

[Zusammenstellung: CompilationRelaxations(8)]
[Assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.DisableOptimizations)]
[Assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[Assembly: AssemblyVersion("0.0.0.0")]
[Modul: Unverifizierbarer Code]
[Modul: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
öffentliche Klasse PersonInfo : IEquatable<PersonInfo>
{
    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private <FirstName>Readonly-Zeichenkette k__BackingField;

    [CompilerGenerated]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    private Readonly-String <LastName>k__BackingField;

    [CompilerGenerated]
    geschützter virtueller Typ-Gleichheitsvertrag
    {
        [CompilerGenerated]
        Erhalten
        {
            return typeof(PersonInfo);
        }
    }

    öffentliche Zeichenkette FirstName
    {
        [CompilerGenerated]
        Erhalten
        {
            <FirstName>k__BackingField zurückkehren;
        }
        [CompilerGenerated]
        Anfang
        {
            <FirstName>k__BackingField = Wert;
        }
    }

    öffentlicher String LastName
    {
        [CompilerGenerated]
        Erhalten
        {
            <LastName>kehren Sie k__BackingField zurück;
        }
        [CompilerGenerated]
        Anfang
        {
            <LastName>k__BackingField = Wert;
        }
    }

    öffentliche PersonInfo(Zeichenkette Vorname, Zeichenkette Nachname)
    {
        <FirstName>k__BackingField = Vorname;
        <LastName>k__BackingField = Nachname;
        Basis.. ctor();
    }

    [CompilerGenerated]
    öffentliche Übersteuerungs-String ToString()
    {
        StringBuilder stringBuilder = neuer StringBuilder();
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        wenn (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        return stringBuilder.ToString();
    }

    [CompilerGenerated]
    geschützte virtuelle bool PrintMitglieder (StringBuilder-Builder)
    {
        RuntimeHelpers.EnsureSufficientExecutionStack();
        Bauherr. Anhang ("VorName = ");
        Bauherr. Anhang((Objekt)Vorname);
        Bauherr. Anhang (", Nachname = ");
        Bauherr. Anhang((Objekt)Nachname);
        Return true;
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [CompilerGenerated]
    öffentlicher statischer Bool-Operator!=(PersonInfo links, PersonInfo rechts)
    {
        Rückgabe! (links == rechts);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [CompilerGenerated]
    öffentlicher statischer Bool-Operator ==(PersonInfo links, PersonInfo rechts)
    {
        Zurück (Objekt)links == rechts || ((Objekt)left != null && left. Gleich (rechts));
    }

    [CompilerGenerated]
    öffentliche Überschreibung int GetHashCode()
    {
        Rückkehr (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)]
    [CompilerGenerated]
    öffentliche Übersteuerung bool Gleich (Objekt obj)
    {
        returnieren Equals (obj als PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [CompilerGenerated]
    öffentliche virtuelle Bool Equals (PersonInfo andere)
    {
        Return (Objekt)dies == Sonstiges || ((Objekt)anderes != null && Gleichheitsvertrag == andere. EqualityContract & EqualityComparer<string>. Default.Gleich(<FirstName>k__BackingField, andere.<FirstName>k__BackingField) & EqualityComparer<string>. Default.Gleich(<LastName>k__BackingField, andere.<LastName>k__BackingField));
    }

    [CompilerGenerated]
    öffentliche virtuelle PersonInfo <Clone>$()
    {
        neue PersonInfo(this) zurückgeben;
    }

    [CompilerGenerated]
    geschützte PersonInfo (PersonInfo original)
    {
        <FirstName>k__BackingField = original. <FirstName>k__BackingField;
        <LastName>k__BackingField = original. <LastName>k__BackingField;
    }

    [CompilerGenerated]
    public void Deconstruct (rausgehende Zeichenfolge Vorname, aussteigende Zeichenkette Nachnamen)
    {
        FirstName = das. Vorname;
        Nachname = das. Nachname;
    }
}

Namespace Microsoft.CodeAnalysis
{
    [CompilerGenerated]
    [Eingebettet]
    interne versiegelte Klasse EmbeddedAttribute : Attribute
    {
    }
}

Namespace System.Runtime.CompilerServices
{
    [CompilerGenerated]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeZiele.Feld | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
    interne versiegelte Klasse NullableAttribute : Attribut
    {
        öffentliches Readonly-Byte[] NullableFlags;

        public NullableAttribute(byte P_0)
        {
            byte[] Array = neues Byte[1];
            Array[0] = P_0;
            NullableFlags = Array;
        }

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

    [CompilerGenerated]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = falsch, Inherited = false)]
    interne versiegelte Klasse NullableContextAttribute : Attribute
    {
        öffentliches Readnur-Byte-Flag;

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

    [CompilerGenerated]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = falsch, Inherited = false)]
    interne versiegelte Klasse RefSafetyRulesAttribute : Attribut
    {
        öffentlich lesbar-nur-int Version;

        öffentliches RefSafetyRulesAttribute(int P_0)
        {
            Version = P_0;
        }
    }
}
Es generiert automatisch Konstruktoren, schreibt die ToString-, GetHashCode- und Equals-Methoden um und generiert einige Methoden automatisch.


p1 und p2 sind tatsächlich zwei verschiedene Objekte, aber da der Compiler automatisch den Komparator (IEquatable) generierte und die Equals- und GetHashCode-Methoden neu schrieb, war die Ausgabe wahr. Das Aufrufen der ToString-Methode ist ebenfalls sehr intuitiv, um den aufgezeichneten Wert auszugeben. Wie unten gezeigt:

.NET/C# implementiert den benutzerdefinierten IEqualityComparator
https://www.itsvse.com/thread-10643-1-1.html



Aufzeichnung

Erforderlich:erforderlicher Modifikator gibt an, dass das Feld oder Attribut, das er anwendet, von allen Konstruktoren oder mit dem Objektinitialisierer initialisiert werden muss. Jeder Ausdruck, der zur Initialisierung einer neuen Instanz dieses Typs verwendet wird, muss alle erforderlichen Mitglieder initialisieren.
Referenz:Der Hyperlink-Login ist sichtbar.

Anfang: In C# 9 und später definiert das init-Schlüsselwort die Zugriffsmethode in einer Eigenschaft oder einem Indexer. Die init-only-Bibliothek weist Attribute oder Indexer-Elemente während der Objekterstellung nur Werte zu. Dies erzwingt Unveränderlichkeit, sodass ein Objekt, sobald es initialisiert ist, nicht mehr verändert werden kann.
Referenz:Der Hyperlink-Login ist sichtbar.

mit: Wenn du eine Instanz mit einigen Modifikationen replizieren musst, kannst du den with-Ausdruck verwenden, um nicht-destruktive Änderungen zu implementieren. mit Ausdruck, um eine neue Datensatzinstanz zu erstellen, die eine Kopie einer bestehenden Datensatzinstanz ist, wobei die angegebenen Eigenschaften und Felder geändert werden.
Referenz:Der Hyperlink-Login ist sichtbar.

Der Datensatz kann also wie folgt definiert werden:

erforderlich, init, und nicht zu schweigen davon, dass es tatsächlich Syntaxzucker istRufen Sie die automatisch generierte <Clone>$-Methode aufund dann den Wert des Attributs modifizieren. Folgendermaßen:



Code:



Datensatzattribut

Manchmal müssen wir den Attributen einige Funktionen hinzufügen, wie zum Beispiel JSON-Serialisierungsfunktionen, Beschreibungsinformationen usw.



Betriebsmittel:

Der Hyperlink-Login ist sichtbar.
Der Hyperlink-Login ist sichtbar.





Vorhergehend:ASP.NET Core (24) basiert auf Refit, MemoryPack Hochleistungskommunikation
Nächster:GitHub verwendet die REST-API, um Repository-Größen anzuzeigen
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com