Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 3341|Jawab: 0

[Sumber] Jenis rekaman fitur baru .NET/C#

[Salin tautan]
Diposting pada 02/10/2023 09.25.51 | | | |
Mulai dari C# 9, Anda dapat menggunakan pengubah rekaman untuk menentukan jenis referensi yang menyediakan fungsionalitas bawaan untuk merangkum data. C# 10 memungkinkan sintaks kelas rekaman sebagai sinonim untuk mengklarifikasi jenis referensi, dan memungkinkan struktur rekaman untuk menentukan jenis nilai menggunakan fungsionalitas yang sama.

Kasus penggunaan untuk catatan dalam C#(ChatGPT menjawab):

Jenis rekaman di C# adalah fitur baru yang diperkenalkan dalam versi terbaru. Ini dapat digunakan dalam banyak skenario, termasuk namun tidak terbatas pada yang berikut:

Objek Data Tidak Dapat Diubah: Jenis rekaman tidak dapat diubah, artinya setelah dibuat, nilai propertinya tidak dapat diubah. Ini membuatnya ideal untuk mewakili struktur data yang tidak dapat diubah seperti objek transfer (DTO) atau pengaturan konfigurasi.
Objek nilai: Jenis rekaman dapat digunakan untuk mewakili objek nilai yang persamaannya ditentukan berdasarkan nilai atributnya daripada kesetaraan referensi. Ini membuatnya ideal untuk membandingkan dan menyimpan objek nilai seperti rentang tanggal, titik koordinat, dan banyak lagi.
Pencocokan Pola: Jenis catatan dapat digunakan bersama dengan pencocokan pola, yang membuatnya lebih nyaman saat bekerja dengan struktur data yang kompleks. Anda dapat menggunakan pencocokan pola untuk memeriksa dan mengekstrak nilai atribut objek rekaman sehingga Anda dapat melakukan tindakan yang sesuai.
Koleksi yang Tidak Dapat Diubah: Jenis rekaman dapat digunakan dengan jenis koleksi yang tidak dapat diubah seperti ImmutableList, ImmutableDictionary, dll., untuk membuat objek koleksi yang tidak dapat diubah. Ini memastikan bahwa konten koleksi tidak dimodifikasi, sehingga meningkatkan keandalan dan keamanan kode.
Ini hanyalah beberapa kasus penggunaan untuk jenis rekaman, dan Anda dapat memutuskan apakah akan menggunakan jenis rekaman berdasarkan kebutuhan spesifik dan struktur kode Anda.
Perbedaan antara catatan dan kelas dan struktur

Sintaks yang digunakan saat mendeklarasikan dan membuat instance kelas atau struktur sama seperti saat merekam operasi. Cukup ganti kata kunci class dengan record, atau gunakan record struct alih-alih struct. Demikian pula, kelas rekaman mendukung sintaks yang sama untuk hubungan pewarisan. Perbedaan antara catatan dan kelas adalah sebagai berikut:

  • Anda dapat menggunakan parameter posisi di konstruktor utama untuk membuat dan membuat instance jenis dengan properti yang tidak dapat diubah.
  • Metode dan operator yang menunjukkan persamaan referensi atau non-kesetaraan dalam kelas (misalnya, Object.Equals(Object) dan ==) menunjukkan persamaan nilai atau non-kesetaraan dalam rekaman.
  • Anda dapat menggunakan ekspresi with untuk membuat salinan objek yang tidak dapat diubah dengan nilai baru dalam atribut yang dipilih.
  • Metode ToString rekaman membuat string format yang menampilkan nama jenis objek dan nama serta nilai dari semua properti umumnya.
  • Rekaman dapat diwarisi dari rekaman lain. Tetapi catatan tidak dapat diwarisi dari kelas, juga tidak dapat mewarisi dari catatan.
  • Perbedaan antara struktur rekaman dan struktur adalah bahwa kompiler mensintesis metode untuk menentukan kesetaraan dan ToString. Kompiler mensintesis metode Dekonstruksi untuk struktur catatan posisi.


Kompiler mensintesis properti inisialisasi saja umum untuk setiap parameter konstruktor utama di kelas rekaman. Dalam struktur rekaman, kompiler mensintesis properti baca/tulis publik. Kompiler tidak membuat properti untuk argumen konstruktor utama dalam jenis kelas dan struktur yang tidak berisi pengubah rekaman.

rekor

Jenis referensi kelas rekaman (default: kelas dapat dihilangkan)
Jenis nilai struktur rekaman

Rekam Gula Tata Bahasa

catatan sebenarnya adalah bahwaSintaks sugar, dan hasil akhirnya adalah kode kelas atau struct。 Ambil kode berikut sebagai contoh:

Terakhir, ini dikompilasi ke kode berikut:

menggunakan Sistem;
menggunakan System.Collections.Generic;
menggunakan System.Diagnostics;
menggunakan System.Reflection;
menggunakan System.Runtime.CompilerServices;
menggunakan System.Security;
menggunakan System.Security.Permissions;
menggunakan System.Text;
menggunakan Microsoft.CodeAnalysis;

[perakitan: KompilasiRelaksasi(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)]
[perakitan: AssemblyVersion("0.0.0.0")]
[modul: Kode Tidak Dapat Diverifikasi]
[modul: System.Runtime.CompilerServices.RefSafetyRules(11)]

[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
kelas publik PersonInfo : IEquatable<PersonInfo>
{
    [KompilatorHasil]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    k__BackingField string readonly pribadi<FirstName>;

    [KompilatorHasil]
    [DebuggerBrowsable(DebuggerBrowsableState.Never)]
    k__BackingField string readonly pribadi<LastName>;

    [KompilatorHasil]
    Jenis Equality Contract virtual yang dilindungi
    {
        [KompilatorHasil]
        dapat
        {
            mengembalikan jenisdari(PersonInfo);
        }
    }

    string publik FirstName
    {
        [KompilatorHasil]
        dapat
        {
            kembali <FirstName>k__BackingField;
        }
        [KompilatorHasil]
        Init
        {
            <FirstName>k__BackingField = nilai;
        }
    }

    string publik Nama Belakang
    {
        [KompilatorHasil]
        dapat
        {
            mengembalikan <LastName>k__BackingField;
        }
        [KompilatorHasil]
        Init
        {
            <LastName>k__BackingField = nilai;
        }
    }

    public PersonInfo(string FirstName, string LastName)
    {
        <FirstName>k__BackingField = Nama Depan;
        <LastName>k__BackingField = Nama Belakang;
        dasar.. ctor();
    }

    [KompilatorHasil]
    string penggantian publik ToString()
    {
        StringBuilder stringBuilder = StringBuilder(); baru
        stringBuilder.Append("PersonInfo");
        stringBuilder.Append(" { ");
        if (PrintMembers(stringBuilder))
        {
            stringBuilder.Append(' ');
        }
        stringBuilder.Append('}');
        mengembalikan stringBuilder.ToString();
    }

    [KompilatorHasil]
    bool virtual yang dilindungi PrintMembers(Pembuat StringBuilder)
    {
        RuntimeHelpers.EnsureSufficientExecutionStack();
        pembangun. Tambahkan("Nama Depan = ");
        pembangun. Tambahkan((objek)Nama Depan);
        pembangun. Tambahkan(", Nama Belakang = ");
        pembangun. Tambahkan((objek)Nama Belakang);
        mengembalikan benar;
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [KompilatorHasil]
    operator bool statis publik !=(PersonInfo kiri, PersonInfo kanan)
    {
        kembali! (kiri == kanan);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [KompilatorHasil]
    operator bool statis publik ==(PersonInfo kiri, PersonInfo kanan)
    {
        Mengembalikan (objek)kiri == kanan || ((objek)kiri != null && kiri. Sama dengan (kanan));
    }

    [KompilatorHasil]
    penggantian publik 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)]
    [KompilatorHasil]
    penggantian publik bool Sama dengan (objek: obj)
    {
        mengembalikan Sama (obj sebagai PersonInfo);
    }

    [System.Runtime.CompilerServices.NullableContext(2)]
    [KompilatorHasil]
    bool virtual publik Equals(PersonInfo lainnya)
    {
        return (objek)ini == lainnya || ((objek)lain != null && KesetaraanKontrak == lainnya. KesetaraanKontrak & <string>KesetaraanKomparasi. Default.Equals(<FirstName>k__BackingField, lainnya.<FirstName>k__BackingField) && <string>KesetaraanPerbandingan. Default.Equals(<LastName>k__BackingField, lainnya.<LastName>k__BackingField));
    }

    [KompilatorHasil]
    PersonInfo virtual publik <Clone>$()
    {
        mengembalikan PersonInfo baru (ini);
    }

    [KompilatorHasil]
    PersonInfo yang dilindungi(PersonInfo asli)
    {
        <FirstName>k__BackingField = asli. <FirstName>k__BackingField;
        <LastName>k__BackingField = asli. <LastName>k__BackingField;
    }

    [KompilatorHasil]
    public void Deconstruct(out string FirstName, out string LastName)
    {
        FirstName = ini. Nama Depan;
        Nama Belakang = ini. Nama Belakang;
    }
}

namespace Microsoft.CodeAnalysis
{
    [KompilatorHasil]
    [Disematkan]
    kelas tertutup internal EmbeddedAttribute : Atribut
    {
    }
}

namespace System.Runtime.CompilerServices
{
    [KompilatorHasil]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | TargetAtribut.Peristiwa | TargetAtribut.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
    kelas tertutup internal NullableAttribute : Atribut
    {
        byte readonly publik[] NullableFlags;

        publik NullableAttribute(byte P_0)
        {
            byte[] array = byte baru[1];
            array[0] = P_0;
            NullableFlags = array;
        }

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

    [KompilatorHasil]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Class | TargetAtribut.Struktur | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
    kelas tersegel internal NullableContextAttribute : Atribut
    {
        bendera byte bacaan publik;

        publik NullableContextAttribute(byte P_0)
        {
            Bendera = P_0;
        }
    }

    [KompilatorHasil]
    [Microsoft.CodeAnalysis.Embedded]
    [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
    kelas tersegel internal RefSafetyRulesAttribute : Atribut
    {
        publik readonly int Versi;

        publik RefSafetyRulesAttribute(int P_0)
        {
            Versi = P_0;
        }
    }
}
Ini secara otomatis menghasilkan konstruktor, dan menulis ulang metode ToString, GetHashCode, Equals, dan secara otomatis menghasilkan beberapa metode.


p1 dan p2 sebenarnya adalah dua objek yang berbeda, tetapi karena kompiler secara otomatis menghasilkan pembanding (IEquatable) dan menulis ulang metode Equals dan GetHashCode, outputnya benar. Memanggil metode ToString juga sangat intuitif untuk menghasilkan nilai yang direkam. Seperti yang ditunjukkan di bawah ini:

.NET/C# mengimplementasikan komparator kustom IEqualityComparer
https://www.itsvse.com/thread-10643-1-1.html



rekor

Diperlukan:required menunjukkan bahwa bidang atau atribut yang diterapkan harus diinisialisasi oleh semua konstruktor atau menggunakan penginisialisasi objek. Setiap ekspresi yang digunakan untuk menginisialisasi instans baru dari jenis tersebut harus menginisialisasi semua anggota yang diperlukan.
Referensi:Login hyperlink terlihat.

Init: Di C# 9 dan yang lebih baru, kata kunci init mendefinisikan metode pengakses dalam properti atau pengindeks. Pustaka Init-Only hanya menetapkan nilai ke atribut atau elemen pengindeks selama konstruksi objek. Ini menegakkan kekekalan, jadi begitu objek diinisialisasi, objek tidak dapat lagi diubah.
Referensi:Login hyperlink terlihat.

dengan: Jika Anda perlu mereplikasi instans dengan beberapa modifikasi, Anda dapat menggunakan ekspresi with untuk menerapkan perubahan non-destruktif. dengan ekspresi untuk membuat instans rekaman baru yang merupakan salinan dari instans rekaman yang ada, memodifikasi properti dan bidang yang ditentukan.
Referensi:Login hyperlink terlihat.

Jadi catatan dapat didefinisikan sebagai berikut:

diperlukan, init, belum lagi, dengan sebenarnya sintaks gula, itu akanPanggil metode $ yang dihasilkan secara otomatis <Clone>lalu ubah nilai atribut. Sebagai berikut:



Kode:



rekaman atribut

Terkadang kita perlu menambahkan beberapa fitur ke atribut, seperti fitur serialisasi JSON, informasi deskripsi, dll.



Sumber daya:

Login hyperlink terlihat.
Login hyperlink terlihat.





Mantan:ASP.NET Core (24) didasarkan pada komunikasi berkinerja tinggi Refit, MemoryPack
Depan:GitHub menggunakan REST API untuk melihat ukuran repositori
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com