|
|
Publicerad på 2023-10-02 09:25:51
|
|
|
|

Från och med C# 9 kan du använda postmodifieraren för att definiera en referenstyp som ger inbyggd funktionalitet för att kapsla in data. C# 10 tillåter postklasssyntax som synonym för att förtydliga referenstyper, och tillåter poststruktur att definiera värdetyper med samma funktionalitet.
Användningsfall för dokumentation i C#(ChatGPT svarar):
Posttypen i C# är en ny funktion som introducerats i den senaste versionen. Den kan användas i många scenarier, inklusive men inte begränsat till följande:
Oföränderligt dataobjekt: Posttypen är oföränderlig, vilket innebär att dess egenskapsvärde inte kan ändras när det väl skapats. Detta gör dem idealiska för att representera oföränderliga datastrukturer såsom överföringsobjekt (DTO) eller konfigurationsinställningar. Värdeobjekt: Posttypen kan användas för att representera värdeobjekt vars likhet bestäms utifrån deras attributvärden snarare än referensekvivalens. Detta gör dem idealiska för att jämföra och lagra värdeobjekt som datumintervall, koordinatpunkter och mer. Mönstermatchning: Posttypen kan användas tillsammans med mönstermatchning, vilket gör det mer bekvämt när man arbetar med komplexa datastrukturer. Du kan använda mönstermatchning för att kontrollera och extrahera attributvärdena för postobjektet så att du kan utföra rätt åtgärd. Oföränderliga samlingar: Posttypen kan användas med oföränderliga samlingstyper såsom ImmutableList, ImmutableDictionary, etc., för att skapa oföränderliga samlingsobjekt. Detta säkerställer att innehållet i samlingen inte ändras, vilket förbättrar kodens tillförlitlighet och säkerhet. Detta är bara några av användningsfallen för posttypen, och du kan avgöra om du vill använda posttypen baserat på dina specifika behov och kodstruktur. Skillnad mellan post och klass och struktur
Syntaxen som används vid deklaration och instansiering av en klass eller struktur är densamma som vid inspelning av en operation. Byt bara ut klassnyckelordet mot post, eller använd poststruktur istället för struct. På liknande sätt stöder postklassen samma syntax för arvsrelationer. Skillnaden mellan ett rekord och en klass är följande:
- Du kan använda positionsparametrar i huvudkonstruktören för att skapa och instansiera typer med oföränderliga egenskaper.
- Metoder och operatorer som indikerar referenslikhet eller icke-likhet i klasser (t.ex. Object.Equals(Object) och ==) indikerar värdelikhet eller icke-likhet i posten.
- Du kan använda uttrycket with för att skapa en kopia av ett oföränderligt objekt med ett nytt värde i det valda attributet.
- ToString-metoden för posten skapar en formatsträng som visar objektets typnamn samt namn och värden för alla dess gemensamma egenskaper.
- En post kan ärvas från en annan post. Men poster kan inte ärvas från klasser, och inte heller från poster.
- Skillnaden mellan poststrukturen och strukturen är att kompilatorn syntetiserar metoder för att bestämma likhet och ToString. Kompilatorn syntetiserar Deconstruct-metoden för positionspoststrukturen.
Kompilatorn syntetiserar en gemensam initieringsegenskap för varje huvudkonstruktörparameter i postklassen. I en poststruktur syntetiserar kompilatorn publika läs-/skrivegenskaper. Kompilatorn skapar inte egenskaper för huvudkonstruktörens argument i klass- och strukturtyper som inte innehåller postmodifieraren.
rekord
Referenstyp för postklass (standard: klass kan utelämnas) Typ av poststrukturvärde
Record Grammatik, socker
Rekordet är faktiskt attSyntax sugar, och slutresultatet är klass- eller strukturkod。 Ta följande kod som exempel:
Slutligen kompilerar den till följande kod:
med System; med System.Collections.Generic; med System.Diagnostics; med System.Reflection; med System.Runtime.CompilerServices; använda System.Security; använda System.Security.Permissions; med System.Text; med hjälp av Microsoft.CodeAnalysis;
[sammansättning: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.DisableOptimizations)] [assembler: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembler: AssemblyVersion("0.0.0.0")] [modul: Overifierbar kod] [modul: System.Runtime.CompilerServices.RefSafetyRules(11)]
[System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] offentlig klass PersonInfo : IEkvantibel<PersonInfo>
{ [CompilerGenerated] [DebuggerBläddrabar(DebuggerBläddraGenombläddradeTillstånd.Never)] privat readonly-sträng <FirstName>k__BackingField;
[CompilerGenerated] [DebuggerBläddrabar(DebuggerBläddraGenombläddradeTillstånd.Never)] privat readonly-sträng <LastName>k__BackingField;
[CompilerGenerated] skyddat virtuellt typ-likhetskontrakt { [CompilerGenerated] få { returnera typof(PersonInfo); } }
publik sträng FirstName { [CompilerGenerated] få { <FirstName>återvända k__BackingField; } [CompilerGenerated] Init { <FirstName>k__BackingField = värde; } }
publik sträng Efternamn { [CompilerGenerated] få { <LastName>återvända k__BackingField; } [CompilerGenerated] Init { <LastName>k__BackingField = värde; } }
public PersonInfo(sträng FirstName, string Efternamn) { <FirstName>k__BackingField = Förnamn; <LastName>k__BackingField = Efternamn; bas.. ctor(); }
[CompilerGenerated] offentlig överstyrningssträng ToString() { StringBuilder stringBuilder = ny StringBuilder(); stringBuilder.Append("PersonInfo"); stringBuilder.Append(" { "); om (PrintMembers(stringBuilder)) { stringBuilder.Append(' '); } stringBuilder.Append('}'); return stringBuilder.ToString(); }
[CompilerGenerated] skyddade virtuella bool PrintMembers (StringBuilder-byggaren) { RuntimeHelpers.EnsureSufficientExecutionStack(); byggmästare. Append("FirstName = "); byggmästare. Append((objekt)Förnamn); byggmästare. Append(", Efternamn = "); byggmästare. Append((objekt)Efternamn); återvänd sant; }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig statisk bool-operatör !=(PersonInfo vänster, PersonInfo höger) { återvända! (vänster == höger); }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig statisk bool operator ==(PersonInfo vänster, PersonInfo höger) { returnera (objekt)vänster == höger || ((objekt)vänster != null && vänster. Lika (höger)); }
[CompilerGenerated] offentlig överskrivning int GetHashCode() { återkomma (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] offentlig överstyrning bool Equals (objekt obj) { returnera Equals (obj som PersonInfo); }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig virtuell bool Equals(PersonInfo other) { returnera (objekt)detta == annat || ((objekt)annat != null && EqualityContract == other. EqualityContract & EqualityComparer<string>. Standard.Equals(<FirstName>k__BackingField, other.<FirstName>k__BackingField) & EqualityComparer<string>. Standard.Lika med <LastName>(k__BackingField, andra.<LastName>k__BackingField)); }
[CompilerGenerated] offentlig virtuell PersonInfo <Clone>$() { returnera ny PersonInfo(detta); }
[CompilerGenerated] skyddad PersonInfo (PersonInfo original) { <FirstName>k__BackingField = original. <FirstName>k__BackingField; <LastName>k__BackingField = original. <LastName>k__BackingField; }
[CompilerGenerated] public void Deconstruct (ut sträng FirstName, ut sträng Efternamn) { FirstName = detta. FirstName; Efternamn = detta. Efternamn; }
}
namnrymden Microsoft.CodeAnalysis
{ [CompilerGenerated] [Inbäddat] intern förseglad klass EmbeddedAttribute : Attribut { }
}
namnrymden System.Runtime.CompilerServices
{ [CompilerGenerated] [Microsoft.CodeAnalysis.Inbäddat] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = falsk, Inherited = falsk)] intern förseglad klass NullableAttribute : Attribut { publik readonly-byte[] NullableFlags;
publik NullableAttribute(byte P_0) { byte[] array = ny byte[1]; array[0] = P_0; NullableFlags = array; }
public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } }
[CompilerGenerated] [Microsoft.CodeAnalysis.Inbäddat] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = falsk, Inherited = falsk)] intern förseglad klass NullableContextAttribute : Attribut { publik readonly-byte-flagga;
publik NullableContextAttribute(byte P_0) { Flagga = P_0; } }
[CompilerGenerated] [Microsoft.CodeAnalysis.Inbäddat] [AttributeUsage(AttributeTargets.Module, AllowMultiple = falskt, Ärvt = falskt)] intern förseglad klass RefSafetyRulesAttribute : Attribut { offentlig readonly int version;
publik RefSafetyRulesAttribute(int P_0) { Version = P_0; } }
} Den genererar automatiskt konstruktorer och skriver om ToString, GetHashCode, Equals-metoderna och genererar automatiskt vissa metoder.
p1 och p2 är faktiskt två olika objekt, men eftersom kompilatorn automatiskt genererade komparatorn (IEquatable) och skrev om Equals- och GetHashCode-metoderna, var utdata sant. Att anropa ToString-metoden är också mycket intuitivt för att ge ut det inspelade värdet. Som visas nedan:
rekord
krävs:required modifier indikerar att fältet eller attributet den använder måste initieras av alla konstruktörer eller använda objektinitieraren. Alla uttryck som används för att initiera en ny instans av den typen måste initiera alla nödvändiga medlemmar. Hänvisning:Inloggningen med hyperlänken är synlig.
Init: I C# 9 och senare definierar init-nyckelordet accessormetoden i en egenskap eller indexerare. Init-only-biblioteket tilldelar endast värden till attribut eller indexerelement under objektkonstruktion. Detta upprätthåller oföränderlighet, så när ett objekt har initierats kan det inte längre ändras. Hänvisning:Inloggningen med hyperlänken är synlig.
med: Om du behöver replikera en instans med vissa modifieringar kan du använda uttrycket with för att implementera icke-destruktiva förändringar. med uttryck för att skapa en ny postinstans som är en kopia av en befintlig postinstans, och modifiera de specificerade egenskaperna och fälten. Hänvisning:Inloggningen med hyperlänken är synlig.
Så posten kan definieras på följande sätt:
krävs, init, för att inte tala om, med är faktiskt syntaxsocker, det kommer attAnropa den automatiskt genererade <Clone>$-metodenoch sedan modifiera värdet på attributet. Följande följer:
Kod:
Rekordattribut
Ibland behöver vi lägga till några funktioner i attributen, såsom JSON-serialiseringsfunktioner, beskrivningsinformation osv.
Resurser:
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
|
Föregående:ASP.NET Core (24) är baserad på Refit, MemoryPack högpresterande kommunikationNästa:GitHub använder REST API för att visa arkivstorlekar
|