|
|
Közzétéve 2023. 10. 02. 9:25:51
|
|
|
|

A C# 9-től kezdve a rekordmódosítót használhatod egy referenciatípus definiálására, amely beépített funkciókat biztosít az adatok kapszulázásához. A C# 10 lehetővé teszi a rekordosztály szintaxisát szinonimáként a referenciatípusok tisztázására, és lehetővé teszi a rekordstruktúra számára, hogy ugyanazzal a funkcióval definiálja az értéktípusokat.
Felhasználási esetek a C# felvételhez(ChatGPT válaszol):
A C# rekordtípus egy új funkció, amelyet a legújabb verzióban vezettek be. Számos helyzetben használható, többek között, de nem kizárólagosan:
Immutable Data Object: A rekordtípus változatlan, vagyis a létrehozás után a tulajdonságértéke nem módosítható. Ez ideálissá teszi őket az átváltoztathatatlan adatstruktúrák, például átviteli objektumok (DTO-k) vagy konfigurációs beállítások ábrázolására. Értékobjektumok: A rekordtípus olyan értékobjektumok ábrázolására használható, amelyek egyenlőségét az attribútumértékeik alapján határozzák meg, nem pedig referenciaekvivalenciájuk. Ez ideálissá teszi őket értékobjektumok, például dátumtartományok, koordinátapontok és egyéb értékek összehasonlítására és tárolására. Mintapárosítás: A rekordtípus együtt használható mintapárosítással, ami kényelmesebbé teszi összetett adatstruktúrákkal való munkát. A mintázatpárosítást használhatod a rekordobjektum attribútumértékeinek ellenőrzésére és kinyerésére, hogy végrehajthasd a megfelelő műveletet. Immutable Collections: A rekordtípus használható olyan változatlan gyűjteménytípusokkal, mint az ImmutableList, ImmutableDictionary stb., hogy módosíthatatlan gyűjteményobjektumokat hozzanak létre. Ez biztosítja, hogy a gyűjtemény tartalma ne változzon, ezáltal javítva a kód megbízhatóságát és biztonságát. Ezek csak néhány felhasználási eset a lemeztípusra, és eldöntheti, hogy a saját igényeid és kódstruktúrád alapján használod-e a rekordtípust. Különbség a rekord, osztály és a szerkezet között
Az osztály vagy struktúra deklarálásakor és megalkotásakor használt szintaxis ugyanaz, mint egy művelet rögzítésekor. Csak cseréld le a class kulcsszót record-ra, vagy használd a record structot a struct helyett. Hasonlóképpen, a rekordosztály ugyanazt a szintaxist támogatja az öröklési kapcsolatok esetén. A rekord és az osztály közötti különbség a következő:
- A fő konstruktor pozicionális paramétereit használhatod arra, hogy változatlan tulajdonságú típusokat hozz létre és instanciálj.
- Azok a módszerek és operátorok, amelyek az osztályokban (pl. Object.Equals(Object) és ==) mutatják az egyenlőséget vagy az egyenlőséget a rekordban.
- Az with kifejezést használhatod egy változatlan objektum másolatának létrehozására, amelynek értéke a kiválasztott attribútumban új értéket ad.
- A rekord ToString módszere egy formátum stringet hoz létre, amely megjeleníti az objektum típusnevét, valamint az összes közös tulajdonságának nevét és értékét.
- Egy rekord örökölhető egy másik rekordból. De a rekordok nem örökölhetők osztályokból, és az osztályok sem lehetnek a rekordokból.
- A rekordstruktúra és a struktúra közötti különbség az, hogy a fordító szintetizál módszereket az egyenlőség és a ToString meghatározására. A fordító szintetizálja a Deconstruct módszert a pozíciórekord szerkezetéhez.
A fordító szintetizál egy közös inicializációs tulajdonságot minden fő konstruktor paraméter számára a rekordosztályban. Egy rekordszerkezetben a fordító szintetizálja a nyilvános olvasási/írási tulajdonságokat. A fordító nem hoz létre tulajdonságokat a fő konstruktor argumentumokhoz az osztály- és szerkezettípusokban, amelyek nem tartalmazzák a rekordmódosítót.
rekord
A rekordosztály referencia típusa (alapértelmezett: osztály kihagyható) Record struct érték típus
Record grammar sugar
A rekord valójában ezSzintaxis cukor, és a végső eredmény az osztály vagy szerkezeti kód。 Vegyük például a következő kódot:
Végül a következő kódra fordítódik:
System használatával; System.Collections.Generic használatával; System.Diagnostics használatával; a System.Reflection használatával; System.Runtime.CompilerServices használatával; a System.Security használatával; System.Security.Permissions használatával; System.Text használatával; a Microsoft.CodeAnalysis használatával;
[összeállítás: CompilationRelaxs(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: UnverifiableCode] [modul: System.Runtime.CompilerServices.RefSafetyRules(11)]
[System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] nyilvános osztály SzemélyInformáció: IEquatable<PersonInfo>
{ [FordítóGenerált] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privát olvasható, csak <FirstName>olvasható sorozat k__BackingField;
[FordítóGenerált] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privát olvasható, csak <LastName>olvasható sorozat k__BackingField;
[FordítóGenerált] védett virtuális Típusegyenlőségi Szerződés { [FordítóGenerált] kap { return typeof (PersonInfo); } }
public string FirstName { [FordítóGenerált] kap { visszatérjen <FirstName>k__BackingField; } [FordítóGenerált] Init { <FirstName>k__BackingField = érték; } }
public string Vezetéknév { [FordítóGenerált] kap { visszatér <LastName>k__BackingField; } [FordítóGenerált] Init { <LastName>k__BackingField = érték; } }
public PersonInfo (string FirstName, string LastName) { <FirstName>k__BackingField = Keresztnév; <LastName>k__BackingField = Vezetéknév; alap.. ctor(); }
[FordítóGenerált] public override string ToString() { StringBuilder stringBuilder = új StringBuilder(); stringBuilder.Append("PersonInfo"); stringBuilder.Append(" { "); if (PrintMembers(stringBuilder)) { stringBuilder.Append(' '); } stringBuilder.Append('}'); return stringBuilder.ToString(); }
[FordítóGenerált] protected virtual bool PrintMembers (StringBuilder builder) { RuntimeHelpers.EnsureEnoughExecutionStack(); építő. Csatolás ("Keresztnév = "); építő. Append((object)FirstName); építő. Append(", Vezetéknév = "); építő. Append((objektum)Vezetéknév); return true; }
[System.Runtime.CompilerServices.NullableContext(2)] [FordítóGenerált] public static bool operator !=(PersonInfo balra, PersonInfo jobbra) { visszatérés! (bal == jobb); }
[System.Runtime.CompilerServices.NullableContext(2)] [FordítóGenerált] public static bool operator ==(PersonInfo bal oldalra, PersonInfo jobbra) { return (objektum)left == jobb || ((objektum)left != null && left. Equals(jobb)); }
[FordítóGenerált] public override int GetHashCode() { return (<Type>Egyenlőségösszehasonlító mű. Default.GetHashCode(EqualityContract) * -1521134295 + EqualityComparer<string>. Default.GetHashCode(<FirstName>k__BackingField)) * -1521134295 + EqualityComparer<string>. Default.GetHashCode(<LastName>k__BackingField); }
[System.Runtime.CompilerServices.NullableContext(2)] [FordítóGenerált] public override bool Equals (object obj) { return Equals (obj mint PersonInfo); }
[System.Runtime.CompilerServices.NullableContext(2)] [FordítóGenerált] public virtual bool Equals(PersonInfo other) { return (objektum)this == más || ((objektum)other != null && EqualityContract == other. EqualityContract && EqualityComparer<string>. Default.Equals(<FirstName>k__BackingField, other.<FirstName>k__BackingField) && <string>Egyenlőségösszehasonlító elem. Default.Equals(<LastName>k__BackingField, other.<LastName>k__BackingField)); }
[FordítóGenerált] nyilvános virtuális PersonInfo <Clone>$() { return new PersonInfo (ez); }
[FordítóGenerált] védett PersonInfo (PersonInfo eredeti) { <FirstName>k__BackingField = eredeti. <FirstName>k__BackingField; <LastName>k__BackingField = eredeti. <LastName>k__BackingField; }
[FordítóGenerált] public void Deconstruct (out string FirstName, out string LastName) { Keresztnév = ez. Keresztnév; Vezetéknév = ez. Vezetéknév; }
}
namespace Microsoft.CodeAnalysis
{ [FordítóGenerált] [Beágyazva] belső zárt osztály EmbeddedAttribute : Attribútum { }
}
Namespace System.Runtime.CompilerServices
{ [FordítóGenerált] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = hamis, Örökölt = hamis)] belső lezárt osztály NullableAttribute : Attribútum { public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0) { byte[] array = új bájt[1]; array[0] = P_0; NullableFlags = tömb; }
public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } }
[FordítóGenerált] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = hamis, Örökölt = hamis)] belső zárt osztály NullableContextAttribute : Attribútum { nyilvános olvasható, csak Flag bájt;
public NullableContextAttribute(byte P_0) { Zászló = P_0; } }
[FordítóGenerált] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = hamis, Örökölt = hamis)] belső lezárt osztály RefSafetyRulesAttribute : Attribútum { public readonly int Version;
public RefSafetyRulesAttribute(int P_0) { Verzió = P_0; } }
} Automatikusan generál konstruktorokat, újraírja a ToString, GetHashCode, Equals metódusokat, és automatikusan generál néhány metódust.
A p1 és a p2 valójában két különálló objektum, de mivel a fordító automatikusan generálta az összehasonlító (IEquatable) és újraírta az Equals és GetHashCode módszereket, a kimenet igaz volt. A ToString módszer hívása is nagyon intuitív, hogy a rögzített értéket kiadjuk. Ahogy az alábbiakban látható:
rekord
szükségesA :required módosító azt jelzi, hogy a mezőt vagy attribútumot minden konstruktor vagy az objektum inicializálója által kell inicializálni. Bármely új példány inicializálásához használt kifejezésnek minden szükséges tagot kell inicializálnia. Utalás:A hiperlink bejelentkezés látható.
Init: C# 9 és későbbi verziókban az init kulcsszó definiálja az accessor metódust egy tulajdonságban vagy indexerben. Az init-only könyvtár csak az objektum építése során rendel értékeket attribútumoknak vagy indexelőelemeknek (indexer). Ez előírja a változtathatatlanságot, így ha egy objektumot inicializáltak, már nem lehet megváltoztatni. Utalás:A hiperlink bejelentkezés látható.
val: Ha egy példányt kell másolni néhány módosítással, az with kifejezést használhatod nem pusztító változtatások végrehajtására. Expression-val, hogy létrehozzanak egy új rekordpéldányt, amely egy meglévő rekordpéldány másolata, módosítva a megadott tulajdonságokat és mezőket. Utalás:A hiperlink bejelentkezés látható.
Tehát a rekord a következőképpen definiálható:
szükséges, init, nem is beszélve, hogy valójában szintaxis, cukor, az is így leszHívjuk az automatikusan generált <Clone>$ módszertmajd módosítsa az attribútum értékét. Következőképpen:
Kód:
Rekord attribútum
Néha néhány tulajdonságot hozzá kell adnunk az attribútumokhoz, például JSON serializációs funkciókat, leírási információkat stb.
Erőforrások:
A hiperlink bejelentkezés látható.
A hiperlink bejelentkezés látható.
|
Előző:ASP.NET Core (24) a Refit, MemoryPack nagy teljesítményű kommunikáción alapulKövetkező:A GitHub a REST API-t használja a tároló méreteinek megtekintésére
|