|
|
Julkaistu 2.10.2023 9.25.51
|
|
|
|

Alkaen C# 9:stä voit käyttää tietueen modifikaattoria määritelläksemme viitetyypin, joka tarjoaa sisäänrakennetun toiminnallisuuden datan kapselointiin. C# 10 sallii tietueluokan syntaksin synonyyminä selventämään viitetyyppejä ja mahdollistaa tietuerakenteiden määritellä arvotyypit samalla toiminnallisuudella.
Käyttötapaukset C#:n äänityksessä(ChatGPT vastaa):
Tietuetyyppi C#:ssa on uusi ominaisuus, joka esiteltiin uusimmassa versiossa. Sitä voidaan käyttää monissa tilanteissa, mukaan lukien mutta ei rajoittuen seuraaviin:
Muuttumaton tietoobjekti: Tietuetyyppi on muuttumaton, eli sen ominaisuusarvoa ei voi muuttaa luomisen jälkeen. Tämä tekee niistä ihanteellisia muuttumattomien tietorakenteiden, kuten siirtoobjektien (DTO) tai konfiguraatioasetuksien esittämiseen. Arvoobjektit: Tietuetyyppiä voidaan käyttää edustamaan arvoobjekteja, joiden yhtäsuuruus määräytyy niiden attribuuttiarvojen perusteella, ei viiteekvivalenssin perusteella. Tämä tekee niistä ihanteellisia arvoobjektien, kuten aikavälien, koordinaattipisteiden ja muiden vertailuun ja tallentamiseen. Kuvioiden sovitus: Tietuetyyppiä voidaan käyttää yhdessä kuvioiden sovittamisen kanssa, mikä tekee siitä kätevämpää monimutkaisten tietorakenteiden kanssa työskentelyssä. Voit käyttää kuvioiden sovitusta tarkistaaksesi ja poimiaksesi tietueen objektin attribuuttiarvot, jotta voit suorittaa oikean toiminnon. Muuttumattomat kokoelmat: Tietuetyyppiä voidaan käyttää yhdessä muuttumattomien kokoelmatyyppien, kuten ImmutableList, ImmutableDictionary jne., kanssa luodakseen muuttumattomia kokoelmaobjekteja. Tämä varmistaa, ettei kokoelman sisältöä muuteta, mikä parantaa koodin luotettavuutta ja turvallisuutta. Nämä ovat vain muutamia käyttötapauksia tietuetyypille, ja voit päättää, käytätkö tietuetyyppiä omien tarpeidesi ja koodirakenteesi perusteella. Ero levyn, luokan ja rakenteen välillä
Syntaksi, jota käytetään luokan tai rakenteen määrittelyssä ja ilmentymisessä, on sama kuin operaation tallentamisessa. Korvaa vain luokkaavainsana tietueella tai käytä tietuetta structia structin sijaan. Samoin tietueluokka tukee samaa syntaksia perintösuhteille. Ero tietueen ja luokan välillä on seuraava:
- Voit käyttää paikkaparametreja pääkonstruktorissa luodaksesi ja ilmentääksesi tyyppejä, joilla on muuttumattomat ominaisuudet.
- Menetelmät ja operaattorit, jotka osoittavat viiteyhtälöt tai ei-yhtälöt luokissa (esim. Object.Equals(Object) ja ==), osoittavat arvon yhtä- tai ei-yhtälöä tietueessa.
- Voit käyttää with-lauseketta luodaksesi kopion muuttumattomasta objektista, jolla on uusi arvo valitussa attribuutissa.
- Tietueen ToString-menetelmä luo muotomerkkijonon, joka näyttää objektin tyyppinimen sekä kaikkien sen yhteisten ominaisuuksien nimet ja arvot.
- Tietue voidaan periä toisesta tietueesta. Mutta tietueita ei voi periä luokilta, eivätkä luokkia voi periä tietueista.
- Ero tietuerakenteen ja rakenteen välillä on siinä, että kääntäjä yhdistää menetelmiä yhtäläisyyden ja ToStringin määrittämiseksi. Kääntäjä synteesi Deconstruct-menetelmän sijaintitietueen rakenteelle.
Kääntäjä synteesi yhteisen pelkkä alustusominaisuuden jokaiselle pääkonstruktoriparametrille tietueluokassa. Tietuerakenneessa kääntäjä synteesi julkiset luku-/kirjoitusominaisuudet. Kääntäjä ei luo ominaisuuksia pääkonstruktoriargumenteille luokka- ja rakennetyypeissä, jotka eivät sisällä tietueen modifikaattoria.
ennätys
tietueluokkaviitetyyppi (oletus: luokka voidaan jättää pois) Tietuerakennearvotyyppi
Record grammar sugar
Ennätys on itse asiassa juuriSyntaksisokeri, ja lopputuloksena on luokka- tai rakennekoodi。 Otetaan seuraava koodi esimerkkinä:
Lopuksi se käännetään seuraavaan koodiin:
käyttämällä Systemiä; käyttäen System.Collections.Generic-tiedostoa; System.Diagnosticsin avulla; käyttäen System.Reflection-toimintoa; käyttäen System.Runtime.CompilerServicesiä; käyttäen System.Securitya; käyttäen System.Security.Permissionsia; käyttäen System.Textiä; käyttäen Microsoft.CodeAnalysisia;
[assembly: 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")] [moduuli: UnverifiableCode] [moduuli: System.Runtime.CompilerServices.RefSafetyRules(11)]
[System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] julkinen luokkaHenkilöTiedot: IEquatable<PersonInfo>
{ [KääntäjäGeneroitu] [DebuggerBrowsable(DebuggerBrowsableState.Never)] yksityinen <FirstName>lukujono k__BackingField;
[KääntäjäGeneroitu] [DebuggerBrowsable(DebuggerBrowsableState.Never)] yksityinen <LastName>lukujono k__BackingField;
[KääntäjäGeneroitu] suojattu virtuaalinen tyypin tasa-arvosopimus { [KääntäjäGeneroitu] saada { return typeof(PersonInfo); } }
julkinen merkkijono FirstName { [KääntäjäGeneroitu] saada { palaa <FirstName>k__BackingField; } [KääntäjäGeneroitu] Init { <FirstName>k__BackingField = arvo; } }
julkinen merkkijono Sukunimi { [KääntäjäGeneroitu] saada { palaa <LastName>k__BackingField; } [KääntäjäGeneroitu] Init { <LastName>k__BackingField = arvo; } }
public PersonInfo (merkkijono Etunimi, merkkijono Sukunimi) { <FirstName>k__BackingField = Etunimi; <LastName>k__BackingField = Sukunimi; kanta.. ctor(); }
[KääntäjäGeneroitu] julkinen ohitusmerkkijono ToString() { StringBuilder stringBuilder = uusi StringBuilder(); stringBuilder.Append("PersonInfo"); stringBuilder.Append(" { "); if (PrintMembers(stringBuilder)) { stringBuilder.Append(' '); } stringBuilder.Append('}'); return stringBuilder.ToString(); }
[KääntäjäGeneroitu] suojattu virtuaalinen bool PrintMembers (StringBuilder builder) { RuntimeHelpers.EnsureSufficientExecutionStack(); rakentaja. Append("Etunimi = "); rakentaja. Append((object)FirstName); rakentaja. Append(", sukunimi = "); rakentaja. Append((object)Sukunimi); return true; }
[System.Runtime.CompilerServices.NullableContext(2)] [KääntäjäGeneroitu] julkinen staattinen bool-operaattori !=(PersonInfo vasemmalla, PersonInfo oikealla) { paluu! (vasen == oikea); }
[System.Runtime.CompilerServices.NullableContext(2)] [KääntäjäGeneroitu] julkinen staattinen bool-operaattori ==(PersonInfo vasemmalla, PersonInfo oikealla) { return (objekti)vasen == oikea || ((objekti)left != null && left. Yhtä suuri (oikea)); }
[KääntäjäGeneroitu] julkinen ohitus int GetHashCode() { return (Tasa-arvovertailija<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)] [KääntäjäGeneroitu] public override bool Equals(object obj) { return Equals (obj as PersonInfo); }
[System.Runtime.CompilerServices.NullableContext(2)] [KääntäjäGeneroitu] julkinen virtuaalinen bool Equals(PersonInfo muu) { return (objekti)this == muu || ((objekti)toinen!= null && EqualityContract == muu. EqualityContract && EqualityComverer<string>. Oletus.Equals(<FirstName>k__BackingField, other.<FirstName>k__BackingField) && EqualityComverer<string>. Oletus.Equals(<LastName>k__BackingField, other.<LastName>k__BackingField)); }
[KääntäjäGeneroitu] julkinen virtuaalinen PersonInfo <Clone>$() { palauttaa uusi PersonInfo (tämä); }
[KääntäjäGeneroitu] suojattu PersonInfo (PersonInfo alkuperäinen) { <FirstName>k__BackingField = alkuperäinen. <FirstName>k__BackingField; <LastName>k__BackingField = alkuperäinen. <LastName>k__BackingField; }
[KääntäjäGeneroitu] public void Deconstruct (ulos merkkijono Etunimi, ulos merkkijono Sukunimi) { Etunimi = tämä. Etunimi; Sukunimi = tämä. Sukunimi; }
}
namespace Microsoft.CodeAnalysis
{ [KääntäjäGeneroitu] [Upotettu] sisäinen suljettu luokka EmbeddedAttribute : Attribuutti { }
}
nimiavaruus System.Runtime.CompilerServices
{ [KääntäjäGeneroitu] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Kenttä | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = epätosi, Peritty = epätosi)] sisäinen sinetöity luokka NullableAttribute : Attribuutti { julkinen luku-only tavu[] NullableFlags;
public NullableAttribute(tavu P_0) { byte[] array = uusi tavu[1]; array[0] = P_0; NullableFlags = taulukko; }
public NullableAttribute(tavu[] P_0) { NullableFlags = P_0; } }
[KääntäjäGeneroitu] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = epätosi, Inherited = väärin)] sisäinen sinetöity luokka NullableContextAttribute : Attribuutti { julkinen vain luku -tavu Flag;
public NullableContextAttribute (tavu P_0) { Lippu = P_0; } }
[KääntäjäGeneroitu] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = väärin, peritty = väärin)] sisäinen suljettu luokka RefSafetyRulesAttribute : Attribuutti { julkinen vain luku -versio;
public RefSafetyRulesAttribute(int P_0) { Versio = P_0; } }
} Se generoi automaattisesti konstruktorit, kirjoittaa uudelleen ToString-, GetHashCode-, Equals-metodit ja luo automaattisesti joitakin metodeja.
p1 ja p2 ovat itse asiassa kaksi eri objektia, mutta koska kääntäjä loi automaattisesti vertailijan (IEquatable) ja kirjoitti uudelleen Equals- ja GetHashCode-metodit, tulos oli tosi. ToString-metodin kutsuminen on myös hyvin intuitiivista, jotta tallennettu arvo saadaan tulossa. Kuten alla on esitetty:
ennätys
pakollinen:required -modifikaattori tarkoittaa, että kenttä tai attribuutti, jota se käyttää, on alustettava kaikkien konstruktorien toimesta tai käyttämällä objektin alustinta käyttäen. Mikä tahansa lauseke, jota käytetään kyseisen tyypin uuden instanssin alustamiseen, on alustettava kaikki tarvittavat jäsenet. Viittaus:Hyperlinkin kirjautuminen on näkyvissä.
Init: C# 9:ssä ja myöhemmissä init-avainsana määrittelee accessor-metodin ominaisuudessa tai indeksoijassa. Vain init-kirjasto määrittää arvoja attribuuteille tai indeksaattorielementeille vain objektin rakentamisen aikana. Tämä vahvistaa muuttumattomuutta, joten kun objekti on alustettu, sitä ei voi enää muuttaa. Viittaus:Hyperlinkin kirjautuminen on näkyvissä.
kanssa: Jos sinun täytyy replikoida instanssi joillain muokkauksilla, voit käyttää with-lauseketta ei-tuhoavien muutosten toteuttamiseen. Expressionin avulla luodaan uusi tietueinstanssi, joka on kopio olemassa olevasta tietueinstanssista, muuttaen määriteltyjä ominaisuuksia ja kenttiä. Viittaus:Hyperlinkin kirjautuminen on näkyvissä.
Näin ollen tietue voidaan määritellä seuraavasti:
vaaditaan, init, puhumattakaan, että syntaksi on sokeri, se tekeeKutsu automaattisesti generoitu <Clone>$-menetelmäja muokkaa sitten attribuutin arvoa. Seuraavasti:
Koodi:
Ennätysominaisuus
Joskus attribuutteihin täytyy lisätä joitakin ominaisuuksia, kuten JSON-sarjallistamisen ominaisuudet, kuvaustiedot jne.
Varat:
Hyperlinkin kirjautuminen on näkyvissä.
Hyperlinkin kirjautuminen on näkyvissä.
|
Edellinen:ASP.NET Core (24) perustuu Refit, MemoryPackin huippusuorituskyvyn viestintäänSeuraava:GitHub käyttää REST-rajapintaa arkistojen kokojen tarkasteluun
|