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, Customer
dan Order
. The Customer
kelas berisi Orders
properti yang pada gilirannya referensi kumpulan contoh dari Order
kelas. The Orders
koleksi 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 Orders
properti sampai kita membutuhkan datanya. Inisialisasi malas memungkinkan kita memuat Orders
koleksi 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 Lazy
kelas sebagai gantinya. The Lazy
kelas dalam System
namespace 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 Lazy
kelas, Anda perlu menentukan tipe objek yang ingin Anda buat secara malas dalam argumen type. Perhatikan bahwa inisialisasi malas terjadi saat Anda mengakses Lazy.Value
properti. Berikut adalah contoh bagaimana Lazy
kelas dapat digunakan:
Malaspesanan = Malas baru (); IEnumerable result = lazyOrders.Value;
Sekarang, pertimbangkan dua kelas, Author
dan Blog
. Seorang penulis dapat menulis banyak posting blog, jadi Anda memiliki hubungan satu-ke-banyak antara kelas Author
dan Blog
seperti 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 Author
dan Blog
telah direpresentasikan menggunakan List
properti (tipe Blog
) di Author
kelas. Menggunakan properti ini, Author
kelas dapat menyimpan koleksi dari satu atau lebih instance Blog
kelas.
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 Author
kelas yang diperbarui yang membahas kebutuhan ini. Perhatikan penggunaan Lazy
kelas.
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 Lazy
kelas generik untuk mengimplementasikan pola desain Singleton. (Anda dapat membaca artikel saya tentang pola desain Singleton di sini.) Versi StateManager
kelas 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 StateManager
kelas yang memanfaatkan Lazy
kelas tersebut. Anda dapat melihat bagaimana Lazy
kelas 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 Instance
properti di StateManager
kelas di atas. Perhatikan bahwa Value
properti 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.