|
|
Publisert på 02.10.2023 09:25:51
|
|
|
|

Fra og med C# 9 kan du bruke postmodifikatoren til å definere en referansetype som gir innebygd funksjonalitet for innkapsling av data. C# 10 tillater postklassesyntaksen som synonym for å klargjøre referansetyper, og lar poststrukturen definere verdityper med samme funksjonalitet.
Brukstilfeller for registrering i C#(ChatGPT svarer):
Posttypen i C# er en ny funksjon introdusert i den nyeste versjonen. Den kan brukes i mange scenarioer, inkludert, men ikke begrenset til, følgende:
Uforanderlig dataobjekt: Posttypen er uforanderlig, noe som betyr at når den først er opprettet, kan ikke egenskapsverdien endres. Dette gjør dem ideelle for å representere uforanderlige datastrukturer som overføringsobjekter (DTO) eller konfigurasjonsinnstillinger. Verdiobjekter: Posttypen kan brukes til å representere verdiobjekter hvis likhet bestemmes basert på attributtverdiene i stedet for referanseekvivalens. Dette gjør dem ideelle for å sammenligne og lagre verdiobjekter som datointervaller, koordinatpunkter og mer. Mønstermatching: Posttypen kan brukes sammen med mønstermatching, noe som gjør det mer praktisk ved arbeid med komplekse datastrukturer. Du kan bruke mønstergjenkjenning for å sjekke og hente ut attributtverdiene til postobjektet slik at du kan utføre riktig handling. Uforanderlige samlinger: Posttypen kan brukes med uforanderlige samlingstyper som ImmutableList, ImmutableDictionary osv. for å lage uforanderlige samlingsobjekter. Dette sikrer at innholdet i samlingen ikke endres, og forbedrer dermed påliteligheten og sikkerheten til koden. Dette er bare noen av bruksområdene for posttypen, og du kan bestemme om du vil bruke posttypen basert på dine spesifikke behov og kodestruktur. Forskjell mellom post og klasse og struktur
Syntaksen som brukes ved deklarasjon og instansiering av en klasse eller struktur er den samme som ved registrering av en operasjon. Bare bytt ut klassenøkkelordet med record, eller bruk record struct i stedet for struct. På samme måte støtter postklassen samme syntaks for arveforhold. Forskjellen mellom en rekord og en klasse er som følger:
- Du kan bruke posisjonsparametere i hovedkonstruktøren for å lage og instansiere typer med uforanderlige egenskaper.
- Metoder og operatorer som indikerer referanselikhet eller ikke-likhet i klasser (f.eks. Object.Equals(Object) og ==) indikerer verdilikhet eller ikke-likhet i posten.
- Du kan bruke with-uttrykket til å lage en kopi av et uforanderlig objekt med en ny verdi i det valgte attributtet.
- ToString-metoden for posten lager en formatstreng som viser typenavnet til objektet samt navnene og verdiene til alle dets felles egenskaper.
- En post kan arves fra en annen post. Men poster kan ikke arves fra klasser, og heller ikke klasser fra poster.
- Forskjellen mellom poststrukturen og strukturen er at kompilatoren syntetiserer metoder for å bestemme likhet og ToString. Kompilatoren syntetiserer Deconstruct-metoden for posisjonspoststrukturen.
Kompilatoren syntetiserer en felles egenskap for kun initialisering for hver hovedkonstruktørparameter i postklassen. I en poststruktur syntetiserer kompilatoren offentlige lese-/skriveegenskaper. Kompilatoren lager ikke egenskaper for hovedkonstruktørargumentene i klasse- og strukturtyper som ikke inneholder postmodifikatoren.
rekord
Referansetype for postklasse (standard: klasse kan utelates) Type poststrukturverdi
Rekordgrammatikk, sukker
Rekorden er faktisk atSyntaks sukker, og sluttresultatet er klasse- eller strukturkode。 Ta følgende kode som eksempel:
Til slutt kompileres den til følgende kode:
ved bruk av System; ved bruk av System.Collections.Generic; bruk av System.Diagnostics; ved bruk av System.Reflection; bruk av System.Runtime.CompilerServices; bruk av System.Security; bruk av System.Security.Permissions; ved bruk av System.Text; ved bruk av 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)] [sammensetning: AssemblyVersion("0.0.0.0")] [modul: Uverifiserbar kode] [modul: System.Runtime.CompilerServices.RefSafetyRules(11)]
[System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] offentlig klasse PersonInfo : IEquatable<PersonInfo>
{ [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privat readonly-streng <FirstName>k__BackingField;
[CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privat readonly-streng <LastName>k__BackingField;
[CompilerGenerated] beskyttet virtuell Type EqualityContract { [CompilerGenerated] få { return typeof(PersonInfo); } }
offentlig streng FirstName { [CompilerGenerated] få { returnere <FirstName>k__BackingField; } [CompilerGenerated] Init { <FirstName>k__BackingField = verdi; } }
offentlig streng Etternavn { [CompilerGenerated] få { returnere <LastName>k__BackingField; } [CompilerGenerated] Init { <LastName>k__BackingField = verdi; } }
offentlig PersonInfo(streng Fornavn, streng Etternavn) { <FirstName>k__BackingField = Fornavn; <LastName>k__BackingField = Etternavn; 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(", Etternavn = "); Builder. Append((objekt)Etternavn); returner sann; }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig statisk bool operator !=(PersonInfo venstre, PersonInfo høyre) { retur! (venstre == høyre); }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig statisk bool operator ==(PersonInfo venstre, PersonInfo høyre) { returner (objekt)venstre == høyre || ((objekt)venstre != null && venstre. Like(høyre)); }
[CompilerGenerated] offentlig overstyring 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)] [CompilerGenerated] offentlig overstyring bool Equals(objekt obj) { returner Equals (obj som PersonInfo); }
[System.Runtime.CompilerServices.NullableContext(2)] [CompilerGenerated] offentlig virtuell bool Equals(PersonInfo annet) { returner (objekt)dette == annet || ((objekt)annet != null && Likhetskontrakt == annet. EqualityContract & EqualityComparer<string>. Standard.Like(<FirstName>k__BackingField, andre.<FirstName>k__BackingField) & EqualityComparer<string>. Standard.Like(<LastName>k__BackingField, annet.<LastName>k__BackingField)); }
[CompilerGenerated] offentlig virtuell 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 (ut streng FirstName, out string Etternavn) { FirstName = dette. Fornavn; Etternavn = dette. Etternavn; }
}
navnerommet Microsoft.CodeAnalysis
{ [CompilerGenerated] [Innebygd] intern forseglet klasse EmbeddedAttribute : Attribute { }
}
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 : Attributt { offentlig readonly-byte[] NullableFlags;
offentlig NullableAttribute(byte P_0) { byte[] array = ny byte[1]; array[0] = P_0; NullableFlags = array; }
offentlig 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-flagg;
offentlig NullableContextAttribute(byte P_0) { Flagg = P_0; } }
[CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = falsk, Inherited = falsk)] intern forseglet klasse RefSafetyRulesAttribute : Attributt { offentlig skrivebeskyttet int versjon;
offentlig RefSafetyRulesAttribute(int P_0) { Versjon = P_0; } }
} Den genererer automatisk konstruktører, og omskriver ToString-, GetHashCode- og Equals-metodene, og genererer automatisk noen metoder.
p1 og p2 er faktisk to forskjellige objekter, men fordi kompilatoren automatisk genererte komparatoren (IEquatable) og skrev om Equals- og GetHashCode-metodene, var utdataene sanne. Å kalle ToString-metoden er også veldig intuitivt for å gi ut den innspilte verdien. Som vist nedenfor:
rekord
påkrevd:nødvendig modifikator indikerer at feltet eller attributtet den anvender må initialiseres av alle konstruktører eller ved bruk av objektinitialisatoren. Ethvert uttrykk som brukes til å initialisere en ny instans av den typen må initialisere alle nødvendige medlemmer. Referanse:Innloggingen med hyperkoblingen er synlig.
Init: I C# 9 og senere definerer init-nøkkelordet accessor-metoden i en egenskap eller indekser. Init-only-biblioteket tildeler kun verdier til attributter eller indekseringselementer under objektbygging. Dette forsterker uforanderlighet, så når et objekt er initialisert, kan det ikke lenger endres. Referanse:Innloggingen med hyperkoblingen er synlig.
med: Hvis du trenger å replikere en instans med noen modifikasjoner, kan du bruke with-uttrykket for å implementere ikke-destruktive endringer. med uttrykk for å opprette en ny postinstans som er en kopi av en eksisterende postinstans, og endre de angitte egenskapene og feltene. Referanse:Innloggingen med hyperkoblingen er synlig.
Så rekorden kan defineres som følger:
nødvendig, init, for ikke å snakke om, med er faktisk syntakssukker, det vil detKall den automatisk genererte <Clone>$-metodenog deretter endre verdien av attributtet. Som følger:
Kode:
Rekordattributt
Noen ganger må vi legge til noen funksjoner i attributtene, som JSON-serialiseringsfunksjoner, beskrivelsesinformasjon osv.
Ressurser:
Innloggingen med hyperkoblingen er synlig.
Innloggingen med hyperkoblingen er synlig.
|
Foregående:ASP.NET Core (24) er basert på Refit, MemoryPack høyytelseskommunikasjonNeste:GitHub bruker REST API-et for å se størrelser på repositorier
|