Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 3341|Yanıt: 0

[Kaynak] .NET/C# yeni özellik kaydı türü

[Bağlantıyı kopyala]
Yayınlandı 2.10.2023 09:25:51 | | | |
C# 9'dan başlayarak, kayıt değiştiricisini kullanarak verileri kapsüllemek için yerleşik işlevsellik sağlayan bir referans tipi tanımlayabilirsiniz. C# 10, kayıt sınıfı sözdiziminin referans türlerini netleştirmek için eşanlamlı olmasına izin verir ve kayıt yapısının aynı işlevselliği kullanarak değer tiplerini tanımlamasına olanak tanır.

C#'da kayıt için kullanım durumları(ChatGPT cevap verir):

C# ile kayıt türü, en son sürümde tanıtılan yeni bir özelliktir. Birçok durumda kullanılabilir, bunlar arasında ancak bunlarla sınırlı olmakla birlikte:

Değişmez Veri Nesnesi: Kayıt türü değiştirilmezdir, yani oluşturulduktan sonra özellik değeri değiştirilemez. Bu da onları transfer nesneleri (DTO) veya yapılandırma ayarları gibi değişmez veri yapılarını temsil etmek için ideal kılar.
Değer nesneleri: Kayıt türü, eşitliği referans eşdeğerliği yerine öznitelik değerlerine göre belirlenen değer nesnelerini temsil etmek için kullanılabilir. Bu da onları tarih aralıkları, koordinat noktaları gibi değer nesnelerini karşılaştırmak ve depolamak için ideal kılar.
Pattern Matching: Kayıt türü, desen eşleştirme ile birlikte kullanılabilir, bu da karmaşık veri yapılarıyla çalışırken daha pratik hale getirir. Kayıt nesnesinin nitelik değerlerini kontrol etmek ve çıkarmak için pattern matching kullanarak uygun eylemi gerçekleştirebilirsiniz.
Değişmez Koleksiyonlar: Kayıt türü, ImmutableList, ImmutableDictionary gibi değişmez koleksiyon tipleriyle birlikte kullanılabilir ve değiştirilebilir koleksiyon nesneleri oluşturulabilir. Bu, koleksiyonun içeriğinin değiştirilmemesini sağlar ve böylece kodun güvenilirliği ve güvenliği artırılır.
Bunlar kayıt tipi için kullanılan birkaç örnektir ve bu tür kayıt tipini kullanıp kullanmamaya özel ihtiyaçlarınıza ve kod yapınıza göre karar verebilirsiniz.
Kayıt ile sınıf ve yapı arasındaki fark

Bir sınıf veya yapı ilan edilirken ve oluşturulurken kullanılan sözdizimi, bir işlemin kaydedilmesiyle aynıdır. Sınıf anahtar kelimesini kayıt ile değiştirin ya da struct yerine kayıt struct kullanın. Benzer şekilde, kayıt sınıfı da miras ilişkileri için aynı sözdizimini destekler. Bir kayıt ile sınıf arasındaki fark şu şekildedir:

  • Ana yapıcının konumsal parametrelerini kullanarak değişmez özelliklere sahip tipler oluşturup örnekleyebilirsiniz.
  • Sınıflarda referans eşitlik veya eşitsizlik gösteren yöntemler ve operatörler (örneğin, Object.Equals(Object) ve ==) kayıtta değer eşitliği veya eşitsizliği gösterir.
  • Seçilen öznitelikte yeni bir değere sahip değişmez bir nesnenin kopyasını oluşturmak için with ifadesini kullanabilirsin.
  • Kaydın ToString yöntemi, nesnenin tip adını ve tüm ortak özelliklerinin adlarını ve değerlerini gösteren bir format dizisi oluşturur.
  • Bir kayıt, başka bir kayıttan miras alınabilir. Ancak kayıtlar sınıflardan miras alınamaz, sınıflar da kayıtlardan miras alınamaz.
  • Kayıt yapısı ile yapı arasındaki fark, derleyicinin eşitlik ve ToString'i belirlemek için yöntemleri sentezlemesidir. Derleyici, konum kaydı yapısı için Deconstruct yöntemini sentezler.


Derleyici, kayıt sınıfındaki her ana üretici parametresi için ortak bir başlatma özelliğini sentezler. Bir kayıt yapısında, derleyici halka açık okuma/yazma özelliklerini sentezler. Derleyici, kayıt değiştiricisini içermeyen sınıf ve yapı türlerinde ana yapıcı argümanları için özellikler oluşturmaz.

kayıt

kayıt sınıfı referans tipi (varsayılan: sınıf atlanabilir)
kayıt yapı değeri tipi

Gramer Sugar kaydı

Kayıt aslında şuSözdizimi şekeri, ve nihai sonuç sınıf veya yapı kodu olur。 Aşağıdaki kodu örnek olarak ele alalım:

Son olarak, aşağıdaki koda derlenir:

System kullanmak;
System.Collections.Generic kullanılarak;
System.Diagnostics kullanmak;
System.Reflection kullanarak;
System.Runtime.CompilerServices kullanarak;
System.Security kullanarak;
System.Security.Permissions kullanarak;
System.Text kullanarak;
Microsoft.CodeAnalysis kullanarak;

[montaj: DerlemeRahatlamalar(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")]
[modül: Doğrulanabilir Kod]
[modül: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
Kamu sınıfı KişiBilgi: IEquatable<PersonInfo>
{
    [DerleyiciOluşturulmuş]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    özel okunabilir <FirstName>diziler k__BackingField;

    [DerleyiciOluşturulmuş]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    özel okuma <LastName>dizesi k__BackingField;

    [DerleyiciOluşturulmuş]
    korunan sanal Tip Eşitlik Sözleşmesi
    {
        [DerleyiciOluşturulmuş]
        Al
        {
            return typeof (PersonInfo);
        }
    }

    public string FirstName
    {
        [DerleyiciOluşturulmuş]
        Al
        {
            <FirstName>k__BackingField dönüş;
        }
        [DerleyiciOluşturulmuş]
        ınit
        {
            <FirstName>k__BackingField = değer;
        }
    }

    public string Soyadı
    {
        [DerleyiciOluşturulmuş]
        Al
        {
            <LastName>k__BackingField dönüş;
        }
        [DerleyiciOluşturulmuş]
        ınit
        {
            <LastName>k__BackingField = değer;
        }
    }

    public PersonInfo (dizi FirstName, string LastName)
    {
        <FirstName>k__BackingField = İlk İsim;
        <LastName>k__BackingField = Soyad;
        taban.. ctor();
    }

    [DerleyiciOluşturulmuş]
    public override string ToString()
    {
        StringBuilder stringBuilder = yeni StringBuilder();
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        if (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        return stringBuilder.ToString();
    }

    [DerleyiciOluşturulmuş]
    protected virtual bool PrintMembers (StringBuilder builder)
    {
        RuntimeHelpers.EnsureEnoughExecutionStack();
        Oluşturucusu. Ek("İlk İsim = ");
        Oluşturucusu. Append((object)FirstName);
        Oluşturucusu. Ek(", Soyadadı = ");
        Oluşturucusu. Append((object)LastName);
        True döner;
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [DerleyiciOluşturulmuş]
    public static bool operatörü !=(PersonInfo solda, PersonInfo sağda)
    {
        dönmek! (sol == sağ);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [DerleyiciOluşturulmuş]
    public static bool operatörü ==(PersonInfo solda, PersonInfo sağda)
    {
        return (nesne)sol == sağ || ((nesne)left != null && left. Eşit(sağ));
    }

    [DerleyiciOluşturulmuş]
    public override int GetHashCode()
    {
        return (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)]
    [DerleyiciOluşturulmuş]
    public override bool Equals(object obj)
    {
        return Equals(obj as PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [DerleyiciOluşturulmuş]
    public virtual bool Equals(PersonInfo other)
    {
        return (nesne)this == diğer || ((nesne)other != null && EqualityContract == other. EqualityContract && Equality <string>Karşılaştırıcısı. Default.Equals(<FirstName>k__BackingField, other.<FirstName>k__BackingField) && Eşitlik <string>Karşılaştırıcısı. Default.Equals(<LastName>k__BackingField, other.<LastName>k__BackingField));
    }

    [DerleyiciOluşturulmuş]
    public virtual PersonInfo <Clone>$()
    {
        yeni PersonInfo (bu) geri döndür;
    }

    [DerleyiciOluşturulmuş]
    korunan PersonInfo (PersonInfo orijinal)
    {
        <FirstName>k__BackingField = orijinal. <FirstName>k__BackingField;
        <LastName>k__BackingField = orijinal. <LastName>k__BackingField;
    }

    [DerleyiciOluşturulmuş]
    public void Deconstruct (out string FirstName, out string LastName)
    {
        İlk Adım = bu. FirstName;
        Soyadı = bu. Soyad;
    }
}

namespace Microsoft.CodeAnalysis
{
    [DerleyiciOluşturulmuş]
    [Gömülü]
    iç mühürlü sınıf EmbeddedAttribute : Attribute
    {
    }
}

namespace System.Runtime.CompilerServices
{
    [DerleyiciOluşturulmuş]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parametre | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = yanlış, Miras alınan = yanlış)]
    iç mühürlü sınıf NullableAttribute : Attribute
    {
        public readonly byte[] NullableFlags;

        public NullableAttribute(byte P_0)
        {
            byte[] array = yeni bayt[1];
            dizi[0] = P_0;
            NullableFlags = dizi;
        }

        public NullableAttribute(byte[] P_0)
        {
            NullableFlags = P_0;
        }
    }

    [DerleyiciOluşturulmuş]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = yanlış, Miras alınan = yanlış)]
    iç mühürlü sınıf NullableContextAttribute : Attribute
    {
        açık okunabilir bayt Bayrak gibi;

        public NullableContextAttribute(byte P_0)
        {
            Bayrak = P_0;
        }
    }

    [DerleyiciOluşturulmuş]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = yanlış, Miras = yanlış)]
    iç mühürlü sınıf RefSafetyRulesAttribute : Attribute
    {
        public readonly int Versiyon;

        public RefSafetyRulesAttribute(int P_0)
        {
            Versiyon = P_0;
        }
    }
}
Otomatik olarak yapıcılar oluşturur, ToString, GetHashCode, Equals metodlarını yeniden yazar ve bazı metodları otomatik olarak oluşturur.


p1 ve p2 aslında iki farklı nesnedir, ancak derleyici karşılaştırıcıyı otomatik olarak oluşturup Equals ve GetHashCode yöntemlerini yeniden yazdığı için çıktı doğruydu. ToString yöntemini çağırmak da kaydedilen değeri çıkarmak için oldukça sezgisel bir yaklaşımdır. Aşağıda gösterildiği gibi:

.NET/C#, IEqualityComparer özel karşılaştırıcısını uygular
https://www.itsvse.com/thread-10643-1-1.html



kayıt

Gerekli:required modifiyeci, uyguladığı alan veya özniteliğin tüm yapıcılar tarafından veya nesne başlatıcısı kullanılarak başlatılması gerektiğini gösterir. Bu tür yeni bir örneği başlatmak için kullanılan herhangi bir ifade, tüm gerekli üyeleri başlatmalıdır.
Referans:Bağlantı girişi görünür.

ınit: C# 9 ve sonrasında, init anahtar kelimesi bir özellik veya indeksleyicideki accessor yöntemini tanımlar. Yalnızca init-kütüphanesi, nesne oluşturma sırasında yalnızca niteliklere veya indeksleyici öğelerine değer atar. Bu, değişmezliği sağlar, böylece bir nesne başlatıldığında artık değiştirilemez.
Referans:Bağlantı girişi görünür.

ile: Bir örneği bazı değişikliklerle çoğaltmanız gerekiyorsa, with ifadesini kullanarak yıkıcı olmayan değişiklikler uygulayabilirsiniz. ifadeyle birlikte mevcut bir kayıt örneğinin kopyası olan yeni bir kayıt örneği oluşturmak için belirtilen özellikleri ve alanları değiştirir.
Referans:Bağlantı girişi görünür.

Yani kayıt şu şekilde tanımlanabilir:

gerekli, init, hatta aslında sözdizimi şeker ileOtomatik olarak <Clone>oluşturulan $ yöntemini çağırınve ardından özniteliğin değerini değiştirir. Şöyle:



Kod:



Kayıt özelliği

Bazen niteliklere JSON serileştirme özellikleri, açıklama bilgileri gibi bazı özellikler eklememiz gerekir.



Kaynaklar:

Bağlantı girişi görünür.
Bağlantı girişi görünür.





Önceki:ASP.NET Core (24), Refit, MemoryPack yüksek performanslı iletişim üzerine dayanmaktadır
Önümüzdeki:GitHub, depo boyutlarını görüntülemek için REST API'sini kullanır
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com