Cara menggunakan kekekalan di C #

Kekekalan adalah fitur bahasa pemrograman fungsional yang membuat program lebih mudah ditulis, diuji, dan dipelihara. Namun, kekekalan tidak didukung oleh banyak bahasa pemrograman imperatif. Sampai saat ini, C # tidak mendukung keabadian out-of-the-box. 

Itu berubah dengan pengenalan catatan di C # 9, yang tersedia untuk pratinjau di .NET 5. Namun, kita dapat menerapkan kekekalan di versi C # sebelumnya dengan menggunakan namespace System.Collections.Immutable, yang tersedia sebagai paket NuGet. 

Objek yang tidak dapat diubah didefinisikan sebagai objek yang tidak dapat diubah setelah dibuat. Untuk banyak kasus penggunaan, seperti Objek Transfer Data, kekekalan adalah fitur yang diinginkan. Artikel ini membahas mengapa kita mungkin ingin memanfaatkan kekekalan dan bagaimana kita bisa menerapkan kekekalan di C #.

Untuk bekerja dengan contoh kode yang disediakan dalam artikel ini, Anda harus menginstal Visual Studio 2019 di sistem Anda. Jika Anda belum memiliki salinannya, Anda dapat mengunduh Visual Studio 2019 di sini. 

Buat proyek aplikasi konsol inti .NET di Visual Studio .NET

Pertama, mari buat proyek aplikasi konsol .NET Core di Visual Studio. Dengan asumsi Visual Studio 2019 diinstal di sistem Anda, ikuti langkah-langkah yang diuraikan di bawah ini untuk membuat proyek aplikasi konsol .NET Core baru di Visual Studio.

  1. Luncurkan Visual Studio IDE.
  2. Klik "Buat proyek baru".
  3. Di jendela "Buat proyek baru", pilih "Aplikasi Konsol (.NET Core)" dari daftar template yang ditampilkan.
  4. Klik Next. 
  5. Di jendela "Configure your new project" yang ditampilkan berikutnya, tentukan nama dan lokasi untuk proyek baru tersebut.
  6. Klik Buat. 

Ini akan membuat proyek aplikasi konsol .NET Core baru di Visual Studio 2019. Kami akan menggunakan proyek ini untuk menggambarkan kekekalan di bagian selanjutnya dari artikel ini.

Instal paket System.Collection.Immutable NuGet

Untuk bekerja dengan tipe yang tidak dapat diubah, Anda harus menginstal paket System.Collections.Immutable dari NuGet. Anda dapat melakukan ini baik melalui manajer paket NuGet di dalam Visual Studio 2019 IDE, atau dengan menjalankan perintah berikut di konsol manajer paket NuGet:

Instal-Paket System.Collections.Immutable

Paket ini terdiri dari kumpulan kelas yang aman untuk thread, juga dikenal sebagai koleksi yang tidak dapat diubah.

Pahami keabadian dan catatan di C # 9

Objek Transfer Data adalah contoh klasik saat Anda menginginkan kekekalan. Instance dari DTO sering kali diserialkan sehingga dapat independen dari teknologi yang digunakan di ujung konsumen. Biasanya, saat mentransfer objek data antara database dan klien, Anda ingin memastikan bahwa objek tidak dapat diubah - dan itulah tujuan DTO. Anda dapat membaca selengkapnya tentang penggunaan Objek Transfer Data di C # dari artikel saya sebelumnya di sini. 

Untuk membuat DTO yang tidak dapat diubah, Anda dapat memanfaatkan ReadOnlyCollection atau jenis koleksi yang tidak dapat diubah yang aman untuk thread di namespace System.Collections.Immutable. Alternatifnya, Anda dapat memanfaatkan jenis rekaman di C # 9 untuk mengimplementasikan DTO yang tidak dapat diubah.

Tipe catatan di C # 9 adalah tipe data yang ringan dan tidak dapat diubah (atau kelas ringan) yang memiliki properti hanya-baca. Karena jenis rekaman tidak dapat diubah, ini aman untuk thread dan tidak dapat bermutasi atau berubah setelah dibuat.

Anda dapat menginisialisasi tipe record hanya di dalam konstruktor. Membuat tipe record untuk kelas (Penulis dalam contoh ini) sesederhana cuplikan kode berikut.

class data Author (int Id, string firstName, string lastName, string address);

Anda juga bisa menulis tipe catatan Penulis seperti yang ditunjukkan pada potongan kode yang diberikan di bawah ini:

kelas data publik Penulis {

    public int Id {get; init; }

    string publik firstName {get; init; }

    string publik lastName {get; init; }

    alamat string publik {get; init; }

}

Catat penggunaan kata kunci data saat mendeklarasikan tipe rekaman. Kata kunci data saat digunakan dalam deklarasi kelas menandai tipe sebagai record. Anda dapat memanfaatkan sebuah instance dari tipe record untuk meneruskan data ke seluruh lapisan sementara pada saat yang sama memastikan ketetapan DTO.

Namespace System.Collections.Immutable

Koleksi yang tidak dapat diubah adalah yang anggotanya tidak dapat diubah setelah dibuat. Namespace System.Collections.Immutable terdiri dari beberapa koleksi yang tidak dapat diubah. Namespace ini berisi versi Daftar, Kamus, Array, Hash, Tumpukan, dan Antrean yang tidak dapat diubah.

ImmutableStack dapat digunakan untuk mendorong dan memunculkan elemen dengan cara yang sama seperti yang kita lakukan dengan tumpukan yang bisa berubah. Namun, karena ImmutableStack adalah koleksi yang tidak dapat diubah, elemennya tidak dapat diubah. Jadi, saat Anda melakukan panggilan ke metode pop untuk mengeluarkan elemen dari tumpukan, tumpukan baru dibuat untuk Anda dan tumpukan asli tetap tidak berubah.

Mari kita ilustrasikan ini dengan sebuah contoh. Cuplikan kode berikut menunjukkan bagaimana Anda dapat mendorong elemen ke tumpukan yang tidak dapat diubah.

var stack = ImmutableStack.Empty;

untuk (int i = 0; i <10; i ++)

{

    tumpukan = tumpukan.Push (i);

}

Program berikut mendemonstrasikan bahwa elemen dari tumpukan yang tidak dapat diubah tidak dapat diubah.

Program kelas

    {      

        static void Main (string [] args)

        {

            var stack = ImmutableStack.Empty;

            untuk (int i = 0; i <10; i ++)

            {

                tumpukan = tumpukan.Push (i);

            }

            Console.WriteLine ("Tidak ada elemen dalam tumpukan asli:

             "+ stack.Count ());

            var newStack = stack.Pop ();

            Console.WriteLine ("Tidak ada elemen dalam tumpukan baru:" +

            newStack.Count ());

            Console.ReadKey ();

        }

    }

Saat Anda menjalankan program di atas, berikut ini tampilan keluarannya di jendela konsol.

Seperti yang Anda lihat pada Gambar 1, tumpukan asli yang tidak dapat diubah (berisi 10 elemen) tidak berubah setelah panggilan ke metode Pop (). Sebaliknya, tumpukan yang tidak dapat diubah baru dibuat dengan 9 elemen.

Koleksi yang tidak dapat diubah tidak menawarkan konstruktor tetapi Anda dapat memanfaatkan metode pabrik statis yang disebut Buat seperti yang ditunjukkan dalam cuplikan kode yang diberikan di bawah ini.

var list = ImmutableList.Create (1, 2, 3, 4, 5);

Jika Anda ingin menambah atau menghapus elemen dari koleksi ini, daftar baru yang tidak dapat diubah akan dibuat dan daftar asli yang tidak dapat diubah akan tetap tidak berubah.

Kekekalan adalah pilihan desain; itu berarti bahwa sebuah instance dari suatu tipe tidak dapat diubah setelah dibuat. Kecuali untuk tumpukan yang tidak dapat diubah dan antrean yang tidak dapat diubah, semua koleksi yang tidak dapat diubah didasarkan pada pohon AVL. Karenanya Anda dapat menyisipkan elemen pada posisi manapun dari koleksi, misalnya, awal, tengah, atau akhir, tanpa perlu menyalin pohon secara keseluruhan.

Bagaimana melakukan lebih banyak di C #:

  • Cara menggunakan anotasi data di C #
  • Cara bekerja dengan GUID di C # 8
  • Kapan menggunakan kelas abstrak vs. antarmuka di C #
  • Bagaimana bekerja dengan AutoMapper di C #
  • Cara menggunakan ekspresi lambda di C #
  • Cara bekerja dengan delegasi Action, Func, dan Predicate di C #
  • Bagaimana bekerja dengan delegasi di C #
  • Bagaimana menerapkan logger sederhana di C #
  • Bagaimana bekerja dengan atribut di C #
  • Bagaimana bekerja dengan log4net di C #
  • Bagaimana menerapkan pola desain repositori di C #
  • Bagaimana bekerja dengan refleksi di C #
  • Bagaimana bekerja dengan filesystemwatcher di C #
  • Bagaimana melakukan inisialisasi malas di C #
  • Bagaimana bekerja dengan MSMQ di C #
  • Bagaimana bekerja dengan metode ekstensi di C #
  • Bagaimana kami ekspresi lambda di C #
  • Kapan menggunakan kata kunci volatile di C #
  • Cara menggunakan kata kunci hasil di C #
  • Bagaimana menerapkan polimorfisme di C #
  • Cara membuat penjadwal tugas Anda sendiri di C #
  • Bagaimana bekerja dengan RabbitMQ di C #
  • Bagaimana bekerja dengan tupel di C #
  • Menjelajahi metode virtual dan abstrak di C #
  • Cara menggunakan Dapper ORM di C #
  • Cara menggunakan pola desain kelas terbang di C #