Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 3341|Válasz: 0

[Forrás] .NET/C# új jellemző rekordtípus

[Linket másol]
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ó:

A .NET/C# az IEqualityComparer egyedi összehasonlítóját valósítja meg
https://www.itsvse.com/thread-10643-1-1.html



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 alapul
Következő:A GitHub a REST API-t használja a tároló méreteinek megtekintésére
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com