Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 3341|Atbildi: 0

[Avots] .NET/C# jauna līdzekļa ieraksta tips

[Kopēt saiti]
Publicēts 02.10.2023 09:25:51 | | | |
Sākot ar C# 9, varat izmantot ierakstu modifikatoru, lai definētu atsauces tipu, kas nodrošina iebūvētu funkcionalitāti datu iekapsulēšanai. C# 10 ļauj ierakstu klases sintaksei kā sinonīmu, lai precizētu atsauces tipus, un ļauj ierakstu struktūrai definēt vērtību tipus, izmantojot to pašu funkcionalitāti.

Lietošanas gadījumi ierakstīšanai C#(ChatGPT atbildes):

Ieraksta tips C# ir jauna funkcija, kas ieviesta jaunākajā versijā. To var izmantot daudzos scenārijos, tostarp, bet ne tikai:

Nemainīgs datu objekts: ieraksta tips ir nemainīgs, tas nozīmē, ka pēc izveidošanas tā rekvizīta vērtību nevar modificēt. Tas padara tos ideāli piemērotus nemainīgu datu struktūru, piemēram, pārsūtīšanas objektu (DTO) vai konfigurācijas iestatījumu attēlošanai.
Vērtību objekti: ieraksta tipu var izmantot, lai attēlotu vērtību objektus, kuru vienlīdzība tiek noteikta, pamatojoties uz to atribūtu vērtībām, nevis atsauces ekvivalenci. Tas padara tos ideāli piemērotus vērtību objektu, piemēram, datumu diapazonu, koordinātu punktu un citu, salīdzināšanai un glabāšanai.
Modeļu atbilstība: ieraksta tipu var izmantot kopā ar modeļu saskaņošanu, kas padara to ērtāku, strādājot ar sarežģītām datu struktūrām. Modeļu atbilstību var izmantot, lai pārbaudītu un izvilktu ieraksta objekta atribūtu vērtības, lai varētu veikt atbilstošo darbību.
Nemainīgas kolekcijas: ieraksta tipu var izmantot ar nemainīgiem kolekcijas tipiem, piemēram, ImmutableList, ImmutableDictionary utt., lai izveidotu nemainīgus kolekcijas objektus. Tas nodrošina, ka kolekcijas saturs netiek mainīts, tādējādi uzlabojot koda uzticamību un drošību.
Šie ir tikai daži no ieraksta tipa lietošanas gadījumiem, un jūs varat izlemt, vai izmantot ieraksta tipu, pamatojoties uz jūsu specifiskajām vajadzībām un koda struktūru.
Atšķirība starp ierakstu un klasi un struktūru

Klases vai struktūras deklarēšanai un instancēšanai izmantotā sintakse ir tāda pati kā operācijas ierakstīšanai. Vienkārši aizstājiet klases atslēgvārdu ar ierakstu vai izmantojiet record struct, nevis struct. Līdzīgi ierakstu klase atbalsta to pašu sintaksi mantojuma relācijām. Atšķirība starp ierakstu un klasi ir šāda:

  • Jūs varat izmantot pozicionālos parametrus galvenajā konstruktorā, lai izveidotu un instancētu tipus ar nemainīgām īpašībām.
  • Metodes un operatori, kas norāda atsauces vienlīdzību vai nevienlīdzību klasēs (piemēram, Object.Equals(Object) un ==), norāda vērtību vienlīdzību vai nevienlīdzību ierakstā.
  • Izteiksmi ar var izmantot, lai izveidotu nemainīga objekta kopiju ar jaunu vērtību atlasītajā atribūtā.
  • Ieraksta metode ToString izveido formāta virkni, kas parāda objekta tipa nosaukumu un visu tā kopīgo rekvizītu nosaukumus un vērtības.
  • Ierakstu var pārmantot no cita ieraksta. Bet ierakstus nevar mantot no klasēm, kā arī klases nevar mantot no ierakstiem.
  • Atšķirība starp ieraksta struktūru un struktūru ir tāda, ka kompilators sintezē metodes, lai noteiktu vienlīdzību un ToString. Kompilators sintezē dekonstruēšanas metodi pozīcijas ieraksta struktūrai.


Kompilators sintezē kopēju tikai inicializācijas rekvizītu katram galvenajam konstruktora parametram ierakstu klasē. Ieraksta struktūrā kompilators sintezē publiskos lasīšanas/rakstīšanas rekvizītus. Kompilators neizveido rekvizītus galvenajiem konstruktora argumentiem klases un struktūras tipos, kas nesatur ieraksta modifikatoru.

rekords

Ieraksta klases atsauces tips (noklusējums: klasi var izlaist)
Ieraksta struktūras vērtības tips

ierakstīt gramatikas cukuru

ieraksts patiesībā ir tasSintakse cukurs, un gala rezultāts ir klases vai struktūras kods。 Kā piemēru ņemiet šādu kodu:

Visbeidzot, tas kompilē šādu kodu:

izmantojot Sistēmu;
izmantojot System.Collections.Generic;
izmantojot System.Diagnostics;
izmantojot System.Reflection;
izmantojot System.Runtime.CompilerServices;
izmantojot System.Security;
izmantojot System.Security.Permissions;
izmantojot System.Text;
izmantojot Microsoft.CodeAnalysis;

[asambleja: CompilationRelaxations(8)]
[montāža: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[montāža: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.DisableOptimizations)]
[montāža: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[montāža: AssemblyVersion ("0.0.0.0")]
[modulis: Neverificējams kods]
[modulis: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
publiskā klase PersonInfo : IEquatable<PersonInfo>
{
    [Ģenerēts kompilators]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    privāta tikai lasāma virkne <FirstName>k__BackingField;

    [Ģenerēts kompilators]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    privāta tikai lasāma virkne <LastName>k__BackingField;

    [Ģenerēts kompilators]
    aizsargāts virtuālais veids EqualityContract
    {
        [Ģenerēts kompilators]
        saņemt
        {
            atgriešanas tips(PersonInfo);
        }
    }

    publiskā virkne Vārds
    {
        [Ģenerēts kompilators]
        saņemt
        {
            atgriešanās <FirstName>k__BackingField;
        }
        [Ģenerēts kompilators]
        Init
        {
            <FirstName>k__BackingField = vērtība;
        }
    }

    publiskā virkne Uzvārds
    {
        [Ģenerēts kompilators]
        saņemt
        {
            atgriešanās <LastName>k__BackingField;
        }
        [Ģenerēts kompilators]
        Init
        {
            <LastName>k__BackingField = vērtība;
        }
    }

    public PersonInfo(virkne Vārds, virkne Uzvārds)
    {
        <FirstName>k__BackingField = Vārds;
        <LastName>k__BackingField = Uzvārds;
        bāze.. ctor();
    }

    [Ģenerēts kompilators]
    publiskā ignorēšanas virkne ToString()
    {
        StringBuilder stringBuilder = jauns StringBuilder();
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        if (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        atgriezt stringBuilder.ToString();
    }

    [Ģenerēts kompilators]
    aizsargāts virtuālais bool PrintMembers(StringBuilder veidotājs)
    {
        RuntimeHelpers.EnsureSufficientExecutionStack();
        Veidotāju. Append("Vārds = ");
        Veidotāju. Addend((objekts)Vārds);
        Veidotāju. Append(", Uzvārds = ");
        Veidotāju. Addend((objekts)Uzvārds);
        atgriešanās true;
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [Ģenerēts kompilators]
    publiskais statiskais bool operators !=(PersonInfo pa kreisi, PersonInfo pa labi)
    {
        atgriezt! (pa kreisi == pa labi);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [Ģenerēts kompilators]
    publiskais statiskais bool operators ==(PersonInfo pa kreisi, PersonInfo pa labi)
    {
        return (objekts) pa kreisi == pa labi || ((objekts) pa kreisi != null && pa kreisi. Vienāds (pa labi));
    }

    [Ģenerēts kompilators]
    publiskā ignorēšana int GetHashCode()
    {
        atgriešanās (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)]
    [Ģenerēts kompilators]
    public override bool Equals(object obj)
    {
        return Equals(obj kā PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [Ģenerēts kompilators]
    publiskais virtuālais bool Equals(PersonInfo cits)
    {
        return (objekts)tas == cits || ((objekts)cits != null && EqualityContract == cits. EqualityContract && EqualityComparer<string>. Default.Equals(<FirstName>k__BackingField, cits.<FirstName>k__BackingField) & EqualityComparer<string>. Default.Equals(<LastName>k__BackingField, cits.<LastName>k__BackingField));
    }

    [Ģenerēts kompilators]
    publiskā virtuālā PersonInfo <Clone>$()
    {
        atgriezt jaunu PersonInfo(this);
    }

    [Ģenerēts kompilators]
    aizsargāta PersonInfo(PersonInfo oriģināls)
    {
        <FirstName>k__BackingField = oriģināls. <FirstName>k__BackingField;
        <LastName>k__BackingField = oriģināls. <LastName>k__BackingField;
    }

    [Ģenerēts kompilators]
    public void Deconstruct(izejas virkne Vārds, izejas virkne Uzvārds)
    {
        Vārds = šis. Vārds;
        Uzvārds = šis. Uzvārds;
    }
}

nosaukumvieta Microsoft.CodeAnalysis
{
    [Ģenerēts kompilators]
    [Iegults]
    iekšējā noslēgtā klase EmbeddedAttribute : Atribūts
    {
    }
}

nosaukumvieta System.Runtime.CompilerServices
{
    [Ģenerēts kompilators]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | Atribūts.Lauks | Atribūts.Notikums | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
    iekšējā noslēgtā klase NullableAttribute : Atribūts
    {
        publiskais lasāmais baits[] NullableFlags;

        publiskais NullableAttribute(baitu P_0)
        {
            baits[] masīvs = jauns baits[1];
            masīvs[0] = P_0;
            NullableFlags = masīvs;
        }

        publiskais NullableAttribute(baits[] P_0)
        {
            NullableFlags = P_0;
        }
    }

    [Ģenerēts kompilators]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | Atribūta mērķi.struktūra | Atribūta mērķi.metode | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
    iekšējā noslēgtā klase NullableContextAttribute : Atribūts
    {
        publiskais lasāmais baitu karogs;

        publiskais NullableContextAttribute(baitu P_0)
        {
            Karogs = P_0;
        }
    }

    [Ģenerēts kompilators]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
    iekšējā aizzīmogotā klase RefSafetyRulesAttribute : Atribūts
    {
        publiskā lasāmā int versija;

        publiskais RefSafetyRulesAttribute(int P_0)
        {
            Versija = P_0;
        }
    }
}
Tas automātiski ģenerē konstruktorus un pārraksta ToString, GetHashCode, Equals metodes un automātiski ģenerē dažas metodes.


p1 un p2 faktiski ir divi dažādi objekti, bet, tā kā kompilators automātiski ģenerēja salīdzinātāju (IEquatable) un pārrakstīja Equals un GetHashCode metodes, rezultāts bija patiess. ToString metodes izsaukšana ir arī ļoti intuitīva, lai izvadītu ierakstīto vērtību. Kā parādīts zemāk:

.NET/C# ievieš IEqualityComparer pielāgoto salīdzinātāju
https://www.itsvse.com/thread-10643-1-1.html



rekords

Nepieciešams:required modifikators norāda, ka lauks vai atribūts, ko tas lieto, ir jāinicializē visiem konstruktoriem vai izmantojot objekta inicializatoru. Jebkurai izteiksmei, kas tiek izmantota, lai inicializētu jaunu šāda tipa instanci, ir jāinicializē visi nepieciešamie dalībnieki.
Atsauce:Hipersaites pieteikšanās ir redzama.

Init: C# 9 un jaunākās versijās init atslēgvārds definē piekļuves metodi rekvizītā vai indeksētājā. Tikai Init bibliotēka piešķir vērtības atribūtiem vai indeksētāja elementiem tikai objekta veidošanas laikā. Tas nodrošina nemainīgumu, tāpēc, kad objekts ir inicializēts, to vairs nevar mainīt.
Atsauce:Hipersaites pieteikšanās ir redzama.

ar: ja nepieciešams replicēt instanci ar dažām modifikācijām, varat izmantot izteiksmi ar, lai ieviestu nesagraujošas izmaiņas. ar izteiksmi, lai izveidotu jaunu ieraksta instanci, kas ir esošas ieraksta instances kopija, modificējot norādītos rekvizītus un laukus.
Atsauce:Hipersaites pieteikšanās ir redzama.

Tātad ierakstu var definēt šādi:

nepieciešams, init, nemaz nerunājot, ar ir faktiski sintakse cukurs, tas būsIzsauciet automātiski ģenerēto <Clone>$ metodiun pēc tam modificējiet atribūta vērtību. Šādi:



Kods:



Ieraksta atribūts

Dažreiz atribūtiem ir jāpievieno dažas funkcijas, piemēram, JSON serializācijas funkcijas, apraksta informācija utt.



Resursu:

Hipersaites pieteikšanās ir redzama.
Hipersaites pieteikšanās ir redzama.





Iepriekšējo:ASP.NET Core (24) ir balstīts uz Refit, MemoryPack augstas veiktspējas komunikāciju
Nākamo:GitHub izmanto REST API, lai skatītu repozitoriju izmērus
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com