Cara menggunakan kebolehubahan dalam C #

Kebolehubahan adalah ciri bahasa pengaturcaraan fungsional yang menjadikan program lebih mudah untuk ditulis, diuji, dan dikekalkan. Walau bagaimanapun, kebolehubahan tidak disokong oleh banyak bahasa pengaturcaraan penting. Sehingga baru-baru ini, C # tidak menyokong kebolehubahan di luar kotak. 

Itu berubah dengan pengenalan rekod di C # 9, yang tersedia untuk pratonton di .NET 5. Namun, kami dapat menerapkan kebolehubahan pada versi C # sebelumnya dengan menggunakan System.Collections.Ipace namespace, yang tersedia sebagai pakej NuGet. 

Objek yang tidak berubah didefinisikan sebagai objek yang tidak dapat diubah setelah dibuat. Untuk banyak kes penggunaan, seperti Objek Pemindahan Data, kebolehubahan adalah ciri yang diinginkan. Artikel ini membincangkan mengapa kita mungkin ingin memanfaatkan kebolehubahan dan bagaimana kita dapat menerapkan kebolehubahan dalam C #.

Untuk bekerja dengan contoh kod yang disediakan dalam artikel ini, anda harus memasang Visual Studio 2019 di sistem anda. Sekiranya anda belum mempunyai salinannya, anda boleh memuat turun Visual Studio 2019 di sini. 

Buat projek aplikasi konsol .NET Core di Visual Studio

Pertama, mari buat projek aplikasi konsol .NET Core di Visual Studio. Dengan mengandaikan Visual Studio 2019 dipasang di sistem anda, ikuti langkah-langkah yang digariskan di bawah untuk membuat projek aplikasi konsol .NET Core baru di Visual Studio.

  1. Lancarkan ID Studio Visual.
  2. Klik "Buat projek baru."
  3. Di tetingkap "Buat projek baru", pilih "Aplikasi Konsol (.NET Core)" dari senarai templat yang dipaparkan.
  4. Klik Seterusnya. 
  5. Di tetingkap "Konfigurasikan projek baru anda" yang ditunjukkan di sebelah, tentukan nama dan lokasi untuk projek baru.
  6. Klik Buat. 

Ini akan membuat projek aplikasi konsol .NET Core baru di Visual Studio 2019. Kami akan menggunakan projek ini untuk menggambarkan kebolehubahan di bahagian seterusnya artikel ini.

Pasang pakej System.Collection.Immutable NuGet

Untuk bekerja dengan jenis yang tidak berubah, anda harus memasang pakej System.Collections.Imutable dari NuGet. Anda boleh melakukannya sama ada melalui pengurus pakej NuGet di dalam Visual Studio 2019 IDE, atau dengan melaksanakan perintah berikut di konsol pengurus pakej NuGet:

Pasang Sistem Pakej. Koleksi. Tidak boleh berubah

Pakej ini merangkumi koleksi kelas yang selamat untuk benang, juga dikenali sebagai koleksi yang tidak berubah.

Fahami kebolehubahan dan rekod dalam C # 9

Objek Pemindahan Data adalah contoh klasik ketika anda mahukan kebolehubahan. Contoh DTO sering diselaraskan sehingga tidak bergantung pada teknologi yang digunakan pada akhir pengguna. Secara semula jadi, ketika memindahkan objek data antara pangkalan data dan klien, anda ingin memastikan bahawa objek tersebut tidak dapat diubah - dan itulah tujuan DTO. Anda boleh membaca lebih lanjut mengenai penggunaan Objek Pemindahan Data di C # dari artikel saya sebelumnya di sini. 

Untuk membuat DTO yang tidak berubah, anda boleh memanfaatkan ReadOnlyCollection atau jenis koleksi benang yang tidak berubah dalam Sistem. Koleksi. Ruang nama yang tidak dapat diubah. Sebagai alternatif, anda boleh memanfaatkan jenis rekod di C # 9 untuk menerapkan DTO yang tidak berubah.

Jenis rekod dalam C # 9 adalah jenis data yang ringan dan tidak berubah (atau kelas ringan) yang mempunyai sifat baca sahaja. Oleh kerana jenis rakaman tidak dapat diubah, ia selamat dari utas dan tidak dapat berubah atau berubah setelah dibuat.

Anda boleh memulakan jenis rekod hanya di dalam konstruktor. Membuat jenis rekod untuk kelas (Pengarang dalam contoh ini) semudah coretan kod berikut.

data kelas Pengarang (int Id, string firstName, string lastName, string address);

Anda juga boleh menulis jenis rekod Pengarang seperti yang ditunjukkan dalam coretan kod yang diberikan di bawah:

Pengarang kelas data awam {

    id int awam {dapatkan; di dalamnya; }

    rentetan awam firstName {get; di dalamnya; }

    rentetan umum nama akhir {get; di dalamnya; }

    alamat rentetan awam {get; di dalamnya; }

}

Perhatikan penggunaan kata kunci data ketika menyatakan jenis rekod. Kata kunci data apabila digunakan dalam pengisytiharan kelas menandakan jenisnya sebagai rekod. Anda boleh memanfaatkan contoh jenis rekod untuk menyebarkan data ke seluruh lapisan dan pada masa yang sama memastikan kebolehubahan DTO.

Sistem.Koleksi. Ruang nama yang tidak berubah

Koleksi yang tidak berubah adalah kumpulan yang anggotanya tidak dapat berubah setelah ia dibuat. Sistem nama. Koleksi. Ruang nama yang tidak berubah merangkumi beberapa koleksi yang tidak berubah. Ruang nama ini mengandungi versi Senarai, Kamus Dewan, Susun atur, Goresan, Tumpukan, dan Baris yang tidak berubah.

ImmutableStack dapat digunakan untuk mendorong dan memunculkan elemen dengan cara yang sama seperti yang kita lakukan dengan tumpukan yang dapat diubah. Namun, kerana ImmutableStack adalah koleksi yang tidak dapat diubah, elemennya tidak dapat diubah. Oleh itu, apabila anda membuat panggilan ke kaedah pop untuk memunculkan elemen dari timbunan, timbunan baru dibuat untuk anda dan timbunan asal tetap tidak berubah.

Mari kita gambarkan ini dengan contoh. Coretan kod berikut menunjukkan bagaimana anda boleh mendorong elemen ke timbunan yang tidak berubah.

var stack = ImmutableStack.Kosong;

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

{

    timbunan = timbunan.Push (i);

}

Program berikut menunjukkan bahawa unsur-unsur tumpukan tidak berubah tidak dapat diubah.

Program kelas

    {      

        kekosongan statik Utama (string [] args)

        {

            var stack = ImmutableStack.Kosong;

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

            {

                timbunan = timbunan.Push (i);

            }

            Console.WriteLine ("Tiada unsur dalam timbunan asal:

             "+ timbunan. Kira ());

            var newStack = stack.Pop ();

            Console.WriteLine ("Tidak ada unsur dalam timbunan baru:" +

            newStack.Count ());

            Konsol.ReadKey ();

        }

    }

Apabila anda menjalankan program di atas, inilah caranya output akan muncul di tetingkap konsol.

Seperti yang anda lihat dalam Rajah 1, timbunan asli yang tidak berubah (mengandungi 10 elemen) tidak berubah setelah panggilan ke kaedah Pop (). Sebaliknya, timbunan tidak berubah baru dibuat dengan 9 elemen.

Koleksi tidak berubah tidak menawarkan konstruktor tetapi anda boleh memanfaatkan kaedah kilang statik yang disebut Buat seperti yang ditunjukkan dalam coretan kod yang diberikan di bawah.

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

Sekiranya anda ingin menambah atau membuang elemen dari koleksi ini, senarai tidak berubah baru akan dibuat dan senarai tidak berubah asal tidak akan berubah.

Kebolehubahan adalah pilihan reka bentuk; ini bermaksud bahawa contoh jenis tidak dapat diubah setelah dibuat. Kecuali untuk tumpukan yang tidak berubah dan barisan yang tidak berubah, semua koleksi yang tidak berubah berdasarkan pada pokok AVL. Oleh itu, anda boleh memasukkan elemen di mana-mana kedudukan koleksi, iaitu awal, tengah, atau akhir, tanpa perlu menyalin keseluruhan pokok.

Cara melakukan lebih banyak perkara di C #:

  • Cara menggunakan anotasi data di C #
  • Cara bekerja dengan GUID di C # 8
  • Bilakah menggunakan kelas abstrak vs antara muka dalam C #
  • Cara bekerja dengan AutoMapper di C #
  • Cara menggunakan ungkapan lambda dalam C #
  • Cara bekerjasama dengan delegasi Action, Func, dan Predicate di C #
  • Cara bekerja dengan perwakilan di C #
  • Cara melaksanakan pembalak sederhana di C #
  • Cara bekerja dengan atribut di C #
  • Cara bekerja dengan log4net di C #
  • Cara melaksanakan corak reka bentuk repositori di C #
  • Cara bekerja dengan refleksi di C #
  • Cara bekerja dengan pemantau sistem fail di C #
  • Cara melakukan inisial malas di C #
  • Cara bekerja dengan MSMQ di C #
  • Cara bekerja dengan kaedah peluasan di C #
  • Bagaimana untuk kami ungkapan lambda dalam C #
  • Bilakah menggunakan kata kunci tidak stabil dalam C #
  • Cara menggunakan kata kunci hasil dalam C #
  • Cara melaksanakan polimorfisme dalam C #
  • Bagaimana membina penjadual tugas anda sendiri di C #
  • Cara bekerja dengan RabbitMQ di C #
  • Cara bekerja dengan tuple di C #
  • Meneroka kaedah maya dan abstrak dalam C #
  • Cara menggunakan Dapper ORM di C #
  • Cara menggunakan corak reka bentuk flyweight di C #