|
|
Zverejnené 2. 10. 2023 9:25:51
|
|
|
|

Od C# 9 môžete použiť modifikátor záznamu na definovanie typu referencie, ktorý poskytuje zabudovanú funkcionalitu na zapuzdrenie dát. C# 10 umožňuje syntax triedy záznamu ako synonymum na objasnenie referenčných typov a umožňuje štruktúre záznamu definovať hodnotové typy pomocou rovnakej funkcionality.
Prípady použitia záznamu v C#(ChatGPT odpovedá):
Typ záznamu v C# je nová funkcia zavedená v najnovšej verzii. Môže sa použiť v mnohých situáciách, vrátane, ale nielen, nasledujúcich:
Nemenný dátový objekt: Typ záznamu je nemenný, čo znamená, že po vytvorení nie je možné meniť hodnotu jeho vlastnosti. To ich robí ideálnymi na reprezentáciu nemenných dátových štruktúr, ako sú prenosové objekty (DTO) alebo konfiguračné nastavenia. Objekty hodnoty: Typ záznamu môže byť použitý na reprezentáciu hodnotových objektov, ktorých rovnosť je určená na základe hodnôt atribútov namiesto referenčnej ekvivalencie. To ich robí ideálnymi na porovnávanie a ukladanie hodnotových objektov, ako sú dátumové rozsahy, súradnicové body a ďalšie. Porovnávanie vzorov: Typ záznamu sa dá použiť spolu s porovnávaním vzorov, čo je pohodlnejšie pri práci so zložitými dátovými štruktúrami. Pattern matching môžete použiť na kontrolu a extrahovanie atribútov objektu záznamu, aby ste mohli vykonať príslušnú akciu. Immutable Collections: Typ záznamu môže byť použitý s nemennými typmi kolekcií, ako sú ImmutableList, ImmutableDictionary a pod., na vytváranie objektov nemenných kolekcií. Tým sa zabezpečuje, že obsah zbierky nie je upravovaný, čím sa zvyšuje spoľahlivosť a bezpečnosť kódu. Toto sú len niektoré z prípadov použitia daného typu záznamu a môžete sa rozhodnúť, či ho použijete podľa vašich špecifických potrieb a štruktúry kódu. Rozdiel medzi záznamom a triedou a štruktúrou
Syntax používaná pri deklarovaní a inštancovaní triedy alebo štruktúry je rovnaká ako pri zaznamenávaní operácie. Jednoducho nahraďte kľúčové slovo triedy za record, alebo použite record struct namiesto struct. Podobne trieda záznamov podporuje rovnakú syntax pre dedičné vzťahy. Rozdiel medzi záznamom a triedou je nasledovný:
- V hlavnom konštruktore môžete použiť polohové parametre na vytváranie a inštancovanie typov s nemennými vlastnosťami.
- Metódy a operátory, ktoré indikujú referenčnú rovnosť alebo nerovnosť v triedach (napr. Object.Equals(Object) a ==), indikujú hodnotovú rovnosť alebo nerovnosť v zázname.
- Môžete použiť výraz with na vytvorenie kópie nemenného objektu s novou hodnotou vo vybranom atribúte.
- Metóda ToString záznamu vytvára formátovací reťazec, ktorý zobrazuje názov typu objektu a názvy a hodnoty všetkých jeho bežných vlastností.
- Záznam môže byť zdedený z iného záznamu. Záznamy však nemožno dediť z tried, ani triedy z záznamov.
- Rozdiel medzi štruktúrou záznamu a štruktúrou je v tom, že kompilátor syntetizuje metódy na určenie rovnosti a ToString. Kompilátor syntetizuje metódu Deconstruct pre štruktúru pozíciového záznamu.
Kompilátor syntetizuje spoločnú vlastnosť iba inicializačnej pre každý hlavný parameter konštruktora v triede záznamu. V štruktúre záznamu kompilátor syntetizuje verejné vlastnosti čítania/zápisu. Kompilátor nevytvára vlastnosti pre hlavné konštruktorové argumenty v typoch tried a štruktúr, ktoré neobsahujú modifikátor záznamu.
rekord
Typ referencie triedy záznamu (predvolené: trieda môže byť vynechaná) Typ hodnoty štruktúry záznamu
Gramatika Record Sugar
Záznam je vlastne taký, žeSyntax sugar a konečný výsledok je class alebo struct code。 Vezmime si ako príklad nasledujúci kód:
Nakoniec sa kompiluje do nasledujúceho kódu:
pomocou systému; používajúc System.Collections.Generic; pomocou System.Diagnostics; pomocou System.Reflection; pomocou System.Runtime.CompilerServices; pomocou System.Security; pomocou System.Security.Permissions; pomocou System.Text; pomocou Microsoft.CodeAnalysis;
[assembly: CompilationRelaxations(8)] [assembly: Runtime Comcombibility(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: UnverifiableCode] [modul: System.Runtime.CompilerServices.RefSafetyRules(11)]
[System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] Informácie o osobe vo verejnej triede: Rovnocenné<PersonInfo>
{ [Generovaný kompilátorom] [DebuggerBrowsable(DebuggerBrowsableState.Never)] súkromný čítací reťazec <FirstName>k__BackingField;
[Generovaný kompilátorom] [DebuggerBrowsable(DebuggerBrowsableState.Never)] súkromný readonly reťazec <LastName>k__BackingField;
[Generovaný kompilátorom] chránený virtuálny typ EqualityContract { [Generovaný kompilátorom] dostať { return typeof(PersonInfo); } }
public string FirstName { [Generovaný kompilátorom] dostať { return <FirstName>k__BackingField; } [Generovaný kompilátorom] Init { <FirstName>k__BackingField = hodnota; } }
verejný reťazec Priezvisko { [Generovaný kompilátorom] dostať { vrátiť <LastName>k__BackingField; } [Generovaný kompilátorom] Init { <LastName>k__BackingField = hodnota; } }
public PersonInfo(reťazec Meno, reťazec Priezvisko) { <FirstName>k__BackingField = Krstné meno; <LastName>k__BackingField = Priezvisko; báza.. ctor(); }
[Generovaný kompilátorom] verejný prepísaný reťazec ToString() { StringBuilder stringBuilder = nový StringBuilder(); stringBuilder.Append("PersonInfo"); stringBuilder.Append(" { "); if (PrintMembers(stringBuilder)) { stringBuilder.Append(' '); } stringBuilder.Append('}'); return stringBuilder.ToString(); }
[Generovaný kompilátorom] chránený virtuálny bool PrintMembers (StringBuilder builder) { RuntimeHelpers.EnsureSufficientExecutionStack(); staviteľ. Pripojiť("FirstName = "); staviteľ. Pridaj((objekt)Krstné meno); staviteľ. Príloha(", priezvisko = "); staviteľ. Pridaj((objekt)Priezvisko); return true; }
[System.Runtime.CompilerServices.NullableContext(2)] [Generovaný kompilátorom] public static bool operátor !=(PersonInfo vľavo, PersonInfo vpravo) { vrátiť! (vľavo == vpravo); }
[System.Runtime.CompilerServices.NullableContext(2)] [Generovaný kompilátorom] verejný statický bool operátor ==(PersonInfo vľavo, PersonInfo vpravo) { return (object)left == right || ((objekt)left != null & left. Equals (vprava); }
[Generovaný kompilátorom] public override 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)] [Generovaný kompilátorom] public override bool Equals (object obj) { return Equals(obj ako PersonInfo); }
[System.Runtime.CompilerServices.NullableContext(2)] [Generovaný kompilátorom] verejný virtuálny bool Equals (PersonInfo ostatné) { return (object)this == iné || ((objekt)iné != null && EqualityContract == iné. EqualityContract & EqualityComparer<string>. Default.Equal(<FirstName>k__BackingField, iné.<FirstName>k__BackingField) & EqualityComparer<string>. Default.Equals(<LastName>k__BackingField, iné.<LastName>k__BackingField)); }
[Generovaný kompilátorom] public virtual PersonInfo <Clone>$() { vrátiť nový PersonInfo(tento); }
[Generovaný kompilátorom] chránený PersonInfo (pôvodný PersonInfo) { <FirstName>k__BackingField = originál. <FirstName>k__BackingField; <LastName>k__BackingField = originál. <LastName>k__BackingField; }
[Generovaný kompilátorom] public void Deconstruct(out string FirstName, out string LastName) { Krstné meno = toto. Krstné meno; Priezvisko = toto. Priezvisko; }
}
Menný priestor Microsoft.CodeAnalysis
{ [Generovaný kompilátorom] [Zabudované] interná uzavretá trieda EmbeddedAttribute : Attribute { }
}
menný priestor System.Runtime.CompilerServices
{ [Generovaný kompilátorom] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] vnútorná uzavretá trieda NullableAttribute : Attribute { verejný readonly bajt[] NullableFlags;
public NullableAttribute(byte P_0) { bajt[] pole = nový bajt[1]; array[0] = P_0; NullableFlags = pole; }
public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } }
[Generovaný kompilátorom] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] interná uzavretá trieda NullableContextAttribute : Attribute { verejný čitateľný bajt Flag;
public NullableContextAttribute(byte P_0) { Vlajka = P_0; } }
[Generovaný kompilátorom] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] interná uzavretá trieda RefSafetyRulesAttribute : Attribute { verejná čítateľná verzia;
public RefSafetyRulesAttribute(int P_0) { Verzia = P_0; } }
} Automaticky generuje konštruktory, prepíše metódy ToString, GetHashCode, Equals a automaticky generuje niektoré metódy.
p1 a p2 sú v skutočnosti dva odlišné objekty, ale pretože kompilátor automaticky generoval komparátor (IEquatable) a prepísal metódy Equals a GetHashCode, výstup bol pravdivý. Volanie metódy ToString je tiež veľmi intuitívne na výstup zaznamenanej hodnoty. Ako je uvedené nižšie:
rekord
požadovaný:required modifikátor označuje, že pole alebo atribút, ktorý aplikuje, musí byť inicializovaný všetkými konštruktormi alebo pomocou inicializátora objektov. Každý výraz použitý na inicializáciu novej inštancie tohto typu musí inicializovať všetky požadované členy. Referencia:Prihlásenie na hypertextový odkaz je viditeľné.
Init: V C# 9 a novších definuje kľúčové slovo init metódu accessoru vo vlastnosti alebo indexeri. Init-only knižnica priraďuje hodnoty atribútom alebo indexerovým prvkom iba počas konštrukcie objektov. To zabezpečuje nemennosť, takže keď je objekt inicializovaný, už ho nie je možné meniť. Referencia:Prihlásenie na hypertextový odkaz je viditeľné.
s: Ak potrebujete replikovať inštanciu s niektorými úpravami, môžete použiť výraz with na implementáciu nedestruktívnych zmien. s výrazom na vytvorenie novej inštancie záznamu, ktorá je kópiou existujúcej inštancie záznamu, pričom sa menia špecifikované vlastnosti a polia. Referencia:Prihlásenie na hypertextový odkaz je viditeľné.
Takže záznam možno definovať nasledovne:
vyžadované, init, nehovoriac o tom, že je to vlastne syntax cukor, budeVoláme <Clone>automaticky generovanú metódu $a potom upraviť hodnotu atribútu. Takto:
Kód:
Atribút rekordu
Niekedy je potrebné pridať k atribútom niektoré funkcie, ako sú JSON serializačné vlastnosti, popisné informácie a podobne.
Zdroje:
Prihlásenie na hypertextový odkaz je viditeľné.
Prihlásenie na hypertextový odkaz je viditeľné.
|
Predchádzajúci:ASP.NET Core (24) je založený na Refit, MemoryPack vysokovýkonnej komunikáciiBudúci:GitHub používa REST API na zobrazenie veľkostí repozitárov
|