|
|
Opslået på 02/10/2023 09.25.51
|
|
|
|

Fra og med C# 9 kan du bruge postmodifikatoren til at definere en referencetype, der giver indbygget funktionalitet til indkapsling af data. C# 10 tillader postklassesyntaksen som synonym til at tydeliggøre referencetyper og tillader poststruktur at definere værdityper ved brug af samme funktionalitet.
Use cases til registrering i C#(ChatGPT svarer):
Posttypen i C# er en ny funktion, der er introduceret i den nyeste version. Den kan bruges i mange scenarier, herunder men ikke begrænset til følgende:
Uforanderligt dataobjekt: Posttypen er uforanderlig, hvilket betyder, at når den først er oprettet, kan dens egenskabsværdi ikke ændres. Dette gør dem ideelle til at repræsentere uforanderlige datastrukturer såsom transfer objects (DTO'er) eller konfigurationsindstillinger. Værdiobjekter: Posttypen kan bruges til at repræsentere værdiobjekter, hvis lighed bestemmes ud fra deres attributværdier frem for referenceækvivalens. Det gør dem ideelle til at sammenligne og gemme værdiobjekter som datointervaller, koordinatpunkter og mere. Mønstermatchning: Posttypen kan bruges sammen med mønstermatchning, hvilket gør det mere bekvemt, når man arbejder med komplekse datastrukturer. Du kan bruge mønstermatching til at tjekke og udtrække attributværdierne for postobjektet, så du kan udføre den relevante handling. Immutable Collections: Posttypen kan bruges med immuableCollection-typer som ImmutableList, ImmutableDictionary osv. for at skabe immutable samlingsobjekter. Dette sikrer, at indholdet af samlingen ikke ændres, hvilket forbedrer kodens pålidelighed og sikkerhed. Dette er blot nogle få af brugstilfældene for posttypen, og du kan beslutte, om du vil bruge posttypen baseret på dine specifikke behov og kodestruktur. Forskel mellem record og class og struct
Syntaksen, der bruges ved deklaration og instansiering af en klasse eller struktur, er den samme som ved registrering af en operation. Udskift bare klassenøgleordet med record, eller brug record struct i stedet for struct. Tilsvarende understøtter postklassen den samme syntaks for arveforhold. Forskellen mellem en rekord og en klasse er som følger:
- Du kan bruge positionsparametre i hovedkonstruktøren til at skabe og instansiere typer med uforanderlige egenskaber.
- Metoder og operatorer, der angiver referencelighed eller ikke-lighed i klasser (f.eks. Object.Equals(Object) og ==) angiver værdilighed eller ikke-lighed i posten.
- Du kan bruge with-udtrykket til at skabe en kopi af et uforanderligt objekt med en ny værdi i den valgte attribut.
- ToString-metoden for posten opretter en formatstreng, der viser objektets typenavn samt navnene og værdierne på alle dets almindelige egenskaber.
- En post kan arves fra en anden post. Men poster kan ikke arves fra klasser, og klasser kan heller ikke arves fra poster.
- Forskellen mellem poststrukturen og strukturen er, at compileren syntetiserer metoder til at bestemme lighed og ToString. Kompilatoren syntetiserer Deconstruct-metoden til positionspoststrukturen.
Kompilatoren syntetiserer en fælles initialiseringsegenskab for hver hovedkonstruktørparameter i postklassen. I en recordstruktur syntetiserer compileren offentlige læse-/skriveegenskaber. Kompilatoren opretter ikke egenskaber for hovedkonstruktørargumenterne i klasse- og strukturtyper, der ikke indeholder postmodifikatoren.
rekord
Referencetype for postklasse (standard: klasse kan udelades) Record Struct Value Type
Record Grammar Sugar
Rekorden er faktisk denSyntaks-sukker, og det endelige resultat er klasse- eller strukturkode。 Tag følgende kode som eksempel:
Endelig kompileres den til følgende kode:
ved brug af System; ved brug af System.Collections.Generic; ved brug af System.Diagnostics; ved brug af System.Reflection; brug af System.Runtime.CompilerServices; brug af System.Security; brug af System.Security.Permissions; ved brug af System.Text; ved brug af Microsoft.CodeAnalysis;
[samling: 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)] [samling: AssemblyVersion("0.0.0.0")] [modul: Uverificerbar kode] [modul: System.Runtime.CompilerServices.RefSafetyRules(11)]
[System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] offentlig klasse PersonInfo : IEkvantibel<PersonInfo>
{ [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privat readonly-streng <FirstName>k__BackingField;
[CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privat readonly-streng <LastName>k__BackingField;
[CompilerGenerated] beskyttet virtuel Type Lighedskontrakt { [CompilerGenerated] få { return typeof(PersonInfo); } }
offentlig streng FirstName { [CompilerGenerated] få { vend <FirstName>tilbage k__BackingField; } [CompilerGenerated] Init { <FirstName>k__BackingField = værdi; } }
offentlig streng Efternavn { [CompilerGenerated] få { vend <LastName>tilbage k__BackingField; } [CompilerGenerated] Init { <LastName>k__BackingField = værdi; } }
offentlig PersonInfo(streng Fornavn, streng Efternavn) { <FirstName>k__BackingField = Fornavn; <LastName>k__BackingField = Efternavn; base.. ctor(); }
[CompilerGenerated] offentlig overstyringsstreng ToString() { StringBuilder stringBuilder = ny StringBuilder(); stringBuilder.Append("PersonInfo"); stringBuilder.Append(" { "); hvis (PrintMembers(stringBuilder)) { stringBuilder.Append(' '); } stringBuilder.Append('}'); return stringBuilder.ToString(); }
[CompilerGenerated] beskyttede virtuelle bool PrintMembers (StringBuilder-bygger) { RuntimeHelpers.EnsureSufficientExecutionStack(); Builder. Append("FirstName = "); Builder. Append((objekt)Fornavn); Builder. Append(", Efternavn = "); Builder. Append((objekt)Efternavn); returner sand; }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig statisk bool operator !=(PersonInfo til venstre, PersonInfo til højre) { returbillet! (venstre == højre); }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig statisk bool operator ==(PersonInfo venstre, PersonInfo højre) { returner (objekt)venstre == højre || ((objekt)venstre != null && venstre. Lige(højre)); }
[CompilerGenerated] offentlig override int GetHashCode() { vend tilbage (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 overstyring bool Lige(objekt obj) { returner Equals (obj som PersonInfo); }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig virtuel bool Equals(PersonInfo anden) { returner (objekt)dette == andet || ((objekt)andet != null && EqualityContract == andet. EqualityContract & EqualityComparer<string>. Standard.Lige(<FirstName>k__BackingField, andet.<FirstName>k__BackingField) & EqualityComparer<string>. Standard.Lige(<LastName>k__BackingField, andet.<LastName>k__BackingField)); }
[CompilerGenerated] offentlig virtuel PersonInfo <Clone>$() { returner ny PersonInfo(denne); }
[CompilerGenerated] beskyttet PersonInfo (PersonInfo original) { <FirstName>k__BackingField = original. <FirstName>k__BackingField; <LastName>k__BackingField = original. <LastName>k__BackingField; }
[CompilerGenerated] public void Deconstruct (ud streng FirstName, out string Efternavn) { FirstName = dette. Fornavn; Efternavn = dette. Efternavn; }
}
navnerum Microsoft.CodeAnalysis
{ [CompilerGenerated] [Indlejret] intern forseglet klasse EmbeddedAttribute : Attribut { }
}
namespace System.Runtime.CompilerServices
{ [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = falsk, Inherited = falsk)] intern forseglet klasse NullableAttribute : Attribut { offentlig readonly byte[] NullableFlags;
public 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.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = falsk, Inherited = falsk)] intern forseglet klasse NullableContextAttribute : Attribute { offentlig readonly-byte-flag;
public NullableContextAttribute(byte P_0) { Flag = P_0; } }
[CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = falsk, Inherited = falsk)] intern lukket klasse RefSafetyRulesAttribute : Attribut { offentlig readonly int version;
offentlig RefSafetyRulesAttribute(int P_0) { Version = P_0; } }
} Den genererer automatisk konstruktører og omskriver ToString, GetHashCode, Equals-metoderne og genererer automatisk nogle metoder.
p1 og p2 er faktisk to forskellige objekter, men fordi compilatoren automatisk genererede comparatoren (IEquatable) og omskrev Equals- og GetHashCode-metoderne, var outputtet sandt. At kalde ToString-metoden er også meget intuitivt for at outputte den registrerede værdi. Som vist nedenfor:
rekord
Kræves:krævet modifikator angiver, at feltet eller attributtet, den anvender, skal initialiseres af alle konstruktører eller ved hjælp af objektinitialisatoren. Ethvert udtryk, der bruges til at initialisere en ny instans af den type, skal initialisere alle nødvendige medlemmer. Henvisning:Hyperlink-login er synlig.
Init: I C# 9 og senere definerer init-nøgleordet accessor-metoden i en egenskab eller indekser. Init-only biblioteket tildeler kun værdier til attributter eller indekseringselementer under objektkonstruktion. Dette håndhæver uforanderlighed, så når et objekt først er initialiseret, kan det ikke længere ændres. Henvisning:Hyperlink-login er synlig.
med: Hvis du skal replikere en instans med nogle modifikationer, kan du bruge with-udtrykket til at implementere ikke-destruktive ændringer. med udtryk for at oprette en ny postinstans, der er en kopi af en eksisterende postinstans, og ændre de specificerede egenskaber og felter. Henvisning:Hyperlink-login er synlig.
Så registreringen kan defineres som følger:
krævet, init, for ikke at nævne, med det er faktisk syntakssukker, det vilKald den automatisk genererede <Clone>$-metodeog derefter modificerer værdien af attributtet. Som følger:
Kodeks:
Rekordattribut
Nogle gange er vi nødt til at tilføje nogle funktioner til attributterne, såsom JSON-serialiseringsfunktioner, beskrivelsesinformation osv.
Ressourcer:
Hyperlink-login er synlig.
Hyperlink-login er synlig.
|
Tidligere:ASP.NET Core (24) er baseret på Refit, MemoryPack højtydende kommunikationNæste:GitHub bruger REST API'en til at se repository-størrelser
|