|
|
Paskelbta 2023-10-02 09:25:51
|
|
|
|

Pradedant nuo C# 9, galite naudoti įrašo modifikatorių, kad nustatytumėte nuorodos tipą, kuris suteikia integruotą duomenų kapsuliavimo funkciją. C# 10 leidžia įrašo klasės sintaksę kaip sinonimą, kad būtų paaiškinti nuorodų tipai, ir leidžia įrašų struktūrai apibrėžti reikšmių tipus naudojant tą pačią funkciją.
C# įrašymo naudojimo atvejai(ChatGPT atsakymai):
Įrašo tipas C# yra nauja funkcija, pristatyta naujausioje versijoje. Jis gali būti naudojamas daugelyje scenarijų, įskaitant, bet neapsiribojant:
Nekintamas duomenų objektas: įrašo tipas yra nekintamas, o tai reiškia, kad sukūrus jo ypatybės reikšmės keisti negalima. Dėl to jie idealiai tinka nekintamoms duomenų struktūroms, tokioms kaip perdavimo objektai (DTO) ar konfigūracijos nustatymai, vaizduoti. Reikšmių objektai: įrašo tipas gali būti naudojamas reikšmių objektams, kurių lygybė nustatoma pagal jų atributų reikšmes, o ne pagal nuorodos ekvivalentiškumą. Dėl to jie idealiai tinka vertės objektams, pvz., datų sekoms, koordinačių taškams ir kt., palyginti ir saugoti. Šablonų atitikimas: įrašo tipas gali būti naudojamas kartu su šablonų gretinimu, todėl patogiau dirbti su sudėtingomis duomenų struktūromis. Galite naudoti šablonų gretinimą, norėdami patikrinti ir išskleisti įrašo objekto atributų reikšmes, kad galėtumėte atlikti atitinkamą veiksmą. Nekintami rinkiniai: įrašo tipas gali būti naudojamas su nekintamais rinkinio tipais, tokiais kaip ImmutableList, ImmutableDictionary ir kt., kuriant nekintamus rinkinio objektus. Tai užtikrina, kad kolekcijos turinys nebūtų pakeistas, taip pagerinant kodo patikimumą ir saugumą. Tai tik keli įrašo tipo naudojimo atvejai, todėl galite nuspręsti, ar naudoti įrašo tipą, atsižvelgdami į konkrečius poreikius ir kodo struktūrą. Skirtumas tarp įrašo ir klasės bei struktūros
Sintaksė, naudojama deklaruojant ir instanciuojant klasę ar struktūrą, yra tokia pati kaip įrašant operaciją. Tiesiog pakeiskite klasės raktažodį įrašu arba naudokite record struct vietoj struct. Panašiai įrašų klasė palaiko tą pačią paveldėjimo ryšių sintaksę. Skirtumas tarp įrašo ir klasės yra toks:
- Galite naudoti padėties parametrus pagrindiniame konstruktoriuje, kad sukurtumėte ir sukurtumėte tipus su nekintančiomis savybėmis.
- Metodai ir operatoriai, nurodantys nuorodų lygybę arba nelygybę klasėse (pvz., Object.Equals(Object) ir ==), įrašo reikšmių lygybę arba nelygybę.
- Galite naudoti išraišką with, norėdami sukurti nekintamo objekto kopiją su nauja pasirinkto atributo reikšme.
- Įrašo metodas ToString sukuria formato eilutę, kurioje rodomas objekto tipo pavadinimas ir visų jo bendrųjų ypatybių pavadinimai bei reikšmės.
- Įrašą galima paveldėti iš kito įrašo. Tačiau įrašų negalima paveldėti iš klasių, taip pat klasių negalima paveldėti iš įrašų.
- Skirtumas tarp įrašo struktūros ir struktūros yra tas, kad kompiliatorius sintezuoja lygybės ir ToString nustatymo metodus. Kompiliatorius sintezuoja Deconstruct metodą pozicijos įrašo struktūrai.
Kompiliatorius sintezuoja bendrą tik inicijavimo ypatybę kiekvienam pagrindiniam konstruktoriaus parametrui įrašų klasėje. Įrašo struktūroje kompiliatorius sintezuoja viešas skaitymo / rašymo ypatybes. Kompiliatorius nekuria pagrindinių konstruktoriaus argumentų ypatybių klasės ir struktūros tipuose, kuriuose nėra įrašo modifikatoriaus.
įrašas
Įrašo klasės nuorodos tipas (numatytasis: klasės galima praleisti) Įrašo struktūros reikšmės tipas
įrašyti gramatikos cukrų
įrašas iš tikrųjų yra tasSintaksė cukrus, o galutinis rezultatas yra klasės arba struktūros kodas。 Kaip pavyzdį paimkite šį kodą:
Galiausiai jis kompiliuojamas į šį kodą:
naudojantis Sistema; naudojant System.Collections.Generic; naudojant "System.Diagnostics"; naudojant System.Reflection; naudojant System.Runtime.CompilerServices; naudojant "System.Security"; naudojant System.Security.Permissions; naudojant System.Text; naudojant Microsoft.CodeAnalysis;
[asamblėja: CompilationRelaxs(8)] [asamblėja: RuntimeCompatibility(WrapNonExceptionThrows = true)] [asamblėja: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.DisableOptimizations)] [rinkinys: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [asamblėja: AssemblyVersion("0.0.0.0")] [modulis: Nepatikrinamas kodas] [modulis: System.Runtime.CompilerServices.RefSafetyRules(11)]
[System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] viešoji klasė PersonInfo : IEquatable<PersonInfo>
{ [Kompiliatorius] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privatus tik skaitomas eilutės <FirstName>k__BackingField;
[Kompiliatorius] [DebuggerBrowsable(DebuggerBrowsableState.Never)] privati tik skaitoma eilutė <LastName>k__BackingField;
[Kompiliatorius] apsaugotas virtualus tipas EqualityContract { [Kompiliatorius] prieiti { grąžinimo tipas(PersonInfo); } }
viešoji eilutė Vardas { [Kompiliatorius] prieiti { grąžinti <FirstName>k__BackingField; } [Kompiliatorius] Init { <FirstName>k__BackingField = vertė; } }
viešoji eilutė Pavardė { [Kompiliatorius] prieiti { grąžinti <LastName>k__BackingField; } [Kompiliatorius] Init { <LastName>k__BackingField = vertė; } }
public PersonInfo(eilutė Vardas, eilutė Pavardė) { <FirstName>k__BackingField = Vardas; <LastName>k__BackingField = Pavardė; bazė.. ctor(); }
[Kompiliatorius] viešoji perrašymo eilutė ToString() { StringBuilder stringBuilder = naujas StringBuilder(); stringBuilder.Append("Asmens informacija"); stringBuilder.Append(" { "); if (PrintMembers(stringBuilder)) { stringBuilder.Append(' '); } stringBuilder.Append('}'); grąžinti stringBuilder.ToString(); }
[Kompiliatorius] apsaugotas virtualus bool PrintMembers(StringBuilder builder) { RuntimeHelpers.EnsureSufficientExecutionStack(); Statybininkas. Addend("Vardas = "); Statybininkas. Append((objektas)Vardas); Statybininkas. addend(", pavardė = "); Statybininkas. Append((object)LastName); grąžinti tiesa; }
[System.Runtime.CompilerServices.NullableContext(2)] [Kompiliatorius] viešasis statinis bool operatorius !=(PersonInfo kairėje, PersonInfo dešinėje) { grįžti! (kairė == dešinė); }
[System.Runtime.CompilerServices.NullableContext(2)] [Kompiliatorius] viešas statinis bool operatorius ==(PersonInfo kairėje, PersonInfo dešinėje) { return (objektas)left == right || ((objektas) left != null && left. Lygu (dešinė)); }
[Kompiliatorius] viešas nepaisymas int GetHashCode() { grąža (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)] [Kompiliatorius] public override bool Equals(object obj) { return Equals(obj kaip PersonInfo); }
[System.Runtime.CompilerServices.NullableContext(2)] [Kompiliatorius] viešas virtualus bool Equals(PersonInfo other) { return (object)this == kita || ((objektas)kita != null && EqualityContract == kita. EqualityContract && EqualityComparer<string>. Default.Equals(<FirstName>k__BackingField, kita.<FirstName>k__BackingField) & EqualityComparer<string>. Default.Equals(<LastName>k__BackingField, kita.<LastName>k__BackingField)); }
[Kompiliatorius] viešas virtualus PersonInfo <Clone>$() { grąžinti naują PersonInfo(this); }
[Kompiliatorius] apsaugota PersonInfo(PersonInfo originalas) { <FirstName>k__BackingField = originalas. <FirstName>k__BackingField; <LastName>k__BackingField = originalas. <LastName>k__BackingField; }
[Kompiliatorius] public void Deconstruct(out string FirstName, out string LastName) { Vardas = tai. Vardas; Pavardė = tai. Pavardė; }
}
vardų sritis Microsoft.CodeAnalysis
{ [Kompiliatorius] [Įterptas] vidinė uždaryta klasė EmbeddedAttribute : Požymis { }
}
vardų sritis System.Runtime.CompilerServices
{ [Kompiliatorius] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] vidinė uždara klasė NullableAttribute : Atributas { viešasis tik skaitomas baitas[] NullableFlags;
viešasis NullableAttribute(baitas P_0) { baitas[] masyvas = naujas baitas[1]; masyvas[0] = P_0; NullableFlags = masyvas; }
public NullableAttribute(baitas[] P_0) { NullableFlags = P_0; } }
[Kompiliatorius] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] vidinė uždara klasė NullableContextAttribute : Atributas { viešas tik skaitomas baitas Vėliava;
public NullableContextAttribute(baitas P_0) { Vėliava = P_0; } }
[Kompiliatorius] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] vidinė sandari klasė RefSafetyRulesAttribute : Požymis { viešas readonly int versija;
public RefSafetyRulesAttribute(int P_0) { Versija = P_0; } }
} Jis automatiškai generuoja konstruktorius ir perrašo ToString, GetHashCode, Equals metodus ir automatiškai generuoja kai kuriuos metodus.
p1 ir p2 iš tikrųjų yra du skirtingi objektai, bet kadangi kompiliatorius automatiškai sugeneravo komparatorių (IEquatable) ir perrašė Equals ir GetHashCode metodus, rezultatas buvo teisingas. Iškviesti ToString metodą taip pat labai intuityviai išvesti įrašytą vertę. Kaip parodyta žemiau:
įrašas
reikalingas:Required modifikatorius nurodo, kad jo taikomą lauką ar atributą turi inicijuoti visi konstruktoriai arba naudojant objekto iniciatorių. Bet kuri išraiška, naudojama naujam tokio tipo egzemplioriui inicijuoti, turi inicijuoti visus reikiamus narius. Nuoroda:Hipersaito prisijungimas matomas.
Init: C# 9 ir naujesnėse versijose raktažodis init apibrėžia prieigos metodą nuosavybėje arba indeksavimo priemonėje. Tik init biblioteka priskiria reikšmes atributams arba indeksavimo elementams tik objekto kūrimo metu. Tai užtikrina nekintamumą, todėl inicijavus objektą, jo nebegalima pakeisti. Nuoroda:Hipersaito prisijungimas matomas.
su: Jei reikia atkartoti egzempliorių su tam tikrais pakeitimais, galite naudoti išraišką with, kad įgyvendintumėte neardomuosius pakeitimus. su išraiška, kad sukurtumėte naują įrašo egzempliorių, kuris yra esamo įrašo egzemplioriaus kopija, modifikuojant nurodytas ypatybes ir laukus. Nuoroda:Hipersaito prisijungimas matomas.
Taigi įrašą galima apibrėžti taip:
reikalingas, init, jau nekalbant apie tai, kad iš tikrųjų yra sintaksės cukrus, jis busIškvieskite automatiškai sugeneruotą <Clone>$ metodąir tada pakeiskite atributo reikšmę. Taip:
Kodas:
Įrašo atributas
Kartais prie atributų turime pridėti kai kurias funkcijas, pvz., JSON serializavimo funkcijas, aprašymo informaciją ir kt.
Išteklių:
Hipersaito prisijungimas matomas.
Hipersaito prisijungimas matomas.
|
Ankstesnis:ASP.NET Core (24) yra pagrįstas Refit, MemoryPack didelio našumo ryšiuKitą:"GitHub" naudoja REST API, kad peržiūrėtų saugyklų dydžius
|