Cara melakukan inisial malas di C #

Inisialisasi malas adalah teknik yang menghalang penciptaan objek hingga pertama kali diperlukan. Dengan kata lain, inisialisasi objek hanya berlaku berdasarkan permintaan. Perhatikan bahawa istilah inisial malas dan pemalas malas bermaksud perkara yang sama - mereka boleh digunakan secara bergantian. Dengan memanfaatkan inisialisasi malas, anda dapat meningkatkan prestasi aplikasi dengan mengelakkan pengiraan dan penggunaan memori yang tidak perlu. Dalam artikel ini kita akan melihat bagaimana kita dapat melakukan inisialisasi malas di C #.

Mari kita fahami pemuatan malas dengan contoh mudah. Pertimbangkan dua kelas, Customerdan Order. The Customerkelas mengandungi Ordersharta yang seterusnya merujuk koleksi contoh daripada Orderkelas. The Orderskoleksi mungkin mengandungi sejumlah besar data dan mungkin memerlukan sambungan pangkalan data untuk menyambung kepada pangkalan data dan mendapatkan semula rekod. Dalam kes seperti itu, tidak ada gunanya memuat data di Ordersharta tanah sampai kita memerlukan data tersebut. Permulaan yang malas membolehkan kita memuatkan Orderskoleksi hanya apabila data diminta.

Menggunakan kelas Malas di C #

Walaupun anda boleh menulis kod tersuai anda sendiri untuk melaksanakan inisialisasi malas, Microsoft mengesyorkan menggunakan Lazykelas sebagai gantinya. The Lazykelas dalam Systemruang nama dalam C # diperkenalkan sebagai sebahagian daripada Rangka Kerja bersih 4.0 untuk menyediakan satu cara thread selamat untuk melaksanakan pengawalan malas. Anda boleh memanfaatkan kelas ini untuk menangguhkan inisialisasi objek intensif sumber dalam aplikasi anda.

Apabila anda menggunakan Lazykelas, anda perlu menentukan jenis objek yang ingin anda buat dengan malas dalam argumen jenis. Perhatikan bahawa permulaan yang malas berlaku semasa anda mengakses Lazy.Valueharta tanah. Berikut adalah contoh bagaimana Lazykelas boleh digunakan:

Malas
   
     pesanan = Malas baru
    
     ();
     

Hasil yang boleh dihitung = lazyOrders.Value;

Sekarang, pertimbangkan dua kelas, Authordan Blog. Seorang pengarang dapat menulis banyak catatan blog, jadi anda mempunyai hubungan satu-ke-banyak antara Authordan Blogkelas seperti yang ditunjukkan dalam coretan kod di bawah.

Pengarang kelas awam

    {

        id int awam {dapatkan; menetapkan; }

        rentetan awam FirstName {get; menetapkan; }

        rentetan umum LastName {get; menetapkan; }

        rentetan awam Alamat {get; menetapkan; }

        Blog Senarai awam {dapatkan; menetapkan; }

    }

    Blog kelas awam

    {

        id int awam {dapatkan; menetapkan; }

        rentetan awam Tajuk {get; menetapkan; }

        awam DateTime PublicationDate {get; menetapkan; }

    }

Perhatikan bahawa hubungan satu-ke-banyak antara Authordan Blogkelas telah ditunjukkan dengan menggunakan Listsifat (jenis Blog) dalam Authorkelas. Dengan menggunakan harta tanah ini, Authorkelas dapat menyimpan koleksi satu atau beberapa contoh Blogkelas.

Sekarang anggap kita hanya perlu memaparkan perincian pengarang (nama pertama, nama belakang, dan alamat) di antara muka pengguna. Tidak ada gunanya memuatkan butiran blog untuk pengarang dalam kes ini; kami mahu memuatkan butiran blog dengan malas. Inilah Authorkelas yang dikemas kini yang menangani keperluan ini. Perhatikan penggunaan Lazykelas.

Pengarang kelas awam

    {

        id int awam {dapatkan; menetapkan; }

        rentetan awam FirstName {get; menetapkan; }

        rentetan umum LastName {get; menetapkan; }

        rentetan awam Alamat {get; menetapkan; }

        awam Malas Blog => Malas baru (() => GetBlogDetailsForAuthor (this.Id));

        GetBlogDetailsForAuthor (int Id) IList peribadi

        {

       // Tulis kod di sini untuk mendapatkan semua butiran blog untuk pengarang.

        }

    }

Menggunakan kelas Lazy generik di C #

Sekarang mari kita lihat bagaimana kita dapat memanfaatkan Lazykelas generik untuk menerapkan corak reka bentuk Singleton. (Anda boleh membaca artikel saya mengenai corak reka bentuk Singleton di sini.) Versi StateManagerkelas berikut selamat digunakan. Pada masa yang sama, ini menunjukkan permulaan yang malas. Perhatikan bahawa konstruktor statik eksplisit telah digunakan untuk memastikan bahawa penyusun C # tidak menandai jenisnya sebagai beforefieldinit.

StateManager kelas tertutup awam

    {

        Pengurus Negeri swasta ()

        {

        }

        Instance StateManager statik awam

        {

            dapatkan

            {

                kembali Nested.obj;

            }

        }

        kelas swasta Bersarang

        {

            bersarang statik ()

            {

            }

            StateManager obj = dalaman StateManager baru

        }

    }

Berikut adalah pelaksanaan StateManagerkelas yang malas yang memanfaatkan Lazykelas. Anda dapat melihat bagaimana Lazykelas menjadikannya sangat mudah untuk melaksanakan kemalasan. 

StateManager kelas awam

    {

        pembacaan statik peribadi Lazy obj = Lazy baru (() => StateManager baru ());

        StateManager swasta () {}

        Instance StateManager statik awam

        {

            dapatkan

            {

                kembali obj.Nilai;

            }

        }

    }

Lihatlah Instanceharta tanah di StateManagerkelas di atas. Perhatikan bahawa Valueharta yang anda lihat dalam contoh kod di atas hanya boleh dibaca. Atas sebab itu tidak ada aksesori set.

Inisialisasi malas adalah teknik pengoptimuman prestasi yang sangat baik, yang membolehkan anda menangguhkan inisialisasi objek yang menggunakan CPU dan sumber memori yang signifikan sehingga anda benar-benar memerlukannya. Manfaatkan inisial yang malas untuk meningkatkan prestasi aplikasi anda.