Bagaimana melakukan inisialisasi malas di C #

Inisialisasi malas adalah teknik yang menunda pembuatan objek sampai dibutuhkan pertama kali. Dengan kata lain, inisialisasi objek hanya terjadi berdasarkan permintaan. Perhatikan bahwa istilah lazy initialization dan lazy instantiation memiliki arti yang sama — keduanya dapat digunakan secara bergantian. Dengan memanfaatkan inisialisasi lambat, Anda dapat meningkatkan performa aplikasi dengan menghindari komputasi dan konsumsi memori yang tidak perlu. Pada artikel ini kita akan melihat bagaimana kita dapat melakukan inisialisasi malas di C #.

Mari kita pahami pemuatan lambat dengan contoh sederhana. Pertimbangkan dua kelas, Customerdan Order. The Customerkelas berisi Ordersproperti yang pada gilirannya referensi kumpulan contoh dari Orderkelas. The Orderskoleksi mungkin berisi sejumlah besar data dan bahkan mungkin memerlukan koneksi database untuk koneksi ke database dan mengambil catatan. Dalam kasus seperti ini, tidak ada gunanya memuat data di Ordersproperti sampai kita membutuhkan datanya. Inisialisasi malas memungkinkan kita memuat Orderskoleksi hanya ketika data diminta.

Menggunakan kelas Lazy di C #

Meskipun Anda dapat menulis kode kustom Anda sendiri untuk menerapkan inisialisasi lambat, Microsoft merekomendasikan untuk menggunakan Lazykelas sebagai gantinya. The Lazykelas dalam Systemnamespace di C # diperkenalkan sebagai bagian dari Net Framework 4.0 untuk menyediakan cara benang-aman untuk melaksanakan inisialisasi malas. Anda dapat memanfaatkan kelas ini untuk menunda inisialisasi objek intensif sumber daya dalam aplikasi Anda.

Saat Anda menggunakan Lazykelas, Anda perlu menentukan tipe objek yang ingin Anda buat secara malas dalam argumen type. Perhatikan bahwa inisialisasi malas terjadi saat Anda mengakses Lazy.Valueproperti. Berikut adalah contoh bagaimana Lazykelas dapat digunakan:

Malas
   
     pesanan = Malas baru
    
     ();
     

IEnumerable result = lazyOrders.Value;

Sekarang, pertimbangkan dua kelas, Authordan Blog. Seorang penulis dapat menulis banyak posting blog, jadi Anda memiliki hubungan satu-ke-banyak antara kelas Authordan Blogseperti yang ditunjukkan pada potongan kode di bawah ini.

kelas publik Penulis

    {

        public int Id {get; set; }

        string publik FirstName {get; set; }

        string publik LastName {get; set; }

        public string Address {get; set; }

        Blog Daftar publik {get; set; }

    }

    Blog kelas publik

    {

        public int Id {get; set; }

        Judul string publik {get; set; }

        publik DateTime PublicationDate {get; set; }

    }

Perhatikan bahwa hubungan satu-ke-banyak antara kelas Authordan Blogtelah direpresentasikan menggunakan Listproperti (tipe Blog) di Authorkelas. Menggunakan properti ini, Authorkelas dapat menyimpan koleksi dari satu atau lebih instance Blogkelas.

Sekarang misalkan kita hanya perlu menampilkan detail penulis (nama depan, nama belakang, dan alamat) di antarmuka pengguna. Tidak ada gunanya memuat detail blog untuk penulis dalam kasus ini; kami ingin memuat detail blog dengan malas. Berikut adalah Authorkelas yang diperbarui yang membahas kebutuhan ini. Perhatikan penggunaan Lazykelas.

kelas publik Penulis

    {

        public int Id {get; set; }

        string publik FirstName {get; set; }

        string publik LastName {get; set; }

        public string Address {get; set; }

        publik Malas Blogs => Malas baru (() => GetBlogDetailsForAuthor (this.Id));

        pribadi IList GetBlogDetailsForAuthor (int Id)

        {

       // Tulis kode di sini untuk mendapatkan semua detail blog dari seorang penulis.

        }

    }

Menggunakan kelas Lazy generik di C #

Sekarang mari kita lihat bagaimana kita dapat memanfaatkan Lazykelas generik untuk mengimplementasikan pola desain Singleton. (Anda dapat membaca artikel saya tentang pola desain Singleton di sini.) Versi StateManagerkelas berikut ini aman untuk thread. Pada saat yang sama, ini menunjukkan inisialisasi lambat. Perhatikan bahwa konstruktor statis eksplisit telah digunakan untuk memastikan bahwa compiler C # tidak menandai tipe sebagai beforefieldinit.

StateManager kelas tertutup publik

    {

        private StateManager ()

        {

        }

        Instance StateManager publik statis

        {

            Dapatkan

            {

                kembali Nested.obj;

            }

        }

        kelas privat Bersarang

        {

            statis Bersarang ()

            {

            }

            statis internal hanya baca ObjectManager = new StateManager ();

        }

    }

Berikut adalah implementasi malas dari StateManagerkelas yang memanfaatkan Lazykelas tersebut. Anda dapat melihat bagaimana Lazykelas membuatnya sangat mudah untuk mengimplementasikan kemalasan. 

public class StateManager

    {

        private static readonly Lazy obj = new Lazy (() => new StateManager ());

        private StateManager () {}

        Instance StateManager publik statis

        {

            Dapatkan

            {

                return obj.Value;

            }

        }

    }

Lihatlah Instanceproperti di StateManagerkelas di atas. Perhatikan bahwa Valueproperti yang Anda lihat pada contoh kode di atas adalah hanya-baca. Untuk alasan itu tidak ada pengakses yang ditetapkan.

Inisialisasi malas adalah teknik pengoptimalan performa yang sangat baik, memungkinkan Anda untuk menunda inisialisasi objek yang mengonsumsi CPU dan sumber daya memori secara signifikan hingga Anda benar-benar membutuhkannya. Manfaatkan inisialisasi malas untuk meningkatkan kinerja aplikasi Anda.