Dua sen saya atas referensi lemah di .Net

GC mahir dalam mendapatkan kembali memori yang ditempati oleh objek yang dikelola. Namun, Anda harus mengambil tindakan ekstra untuk memfasilitasi pengumpulan sampah guna meningkatkan kinerja aplikasi Anda.

Referensi lemah adalah referensi yang mereferensikan objek dalam memori sekaligus memungkinkan pengumpul sampah mengumpulkan objek atau mendapatkan kembali memori yang ditempati oleh objek saat GC berjalan. Objek yang bisa dijangkau bukanlah sampah yang dikumpulkan oleh runtime.

Anda dapat menggunakan referensi yang lemah untuk objek yang menghabiskan banyak memori. Dalam menggunakan referensi yang lemah untuk objek semacam itu, Anda mengaktifkan objek tersebut untuk dikumpulkan sampahnya sementara pada saat yang sama memungkinkan objek tersebut dibuat ulang nanti jika perlu. Jadi, jika Anda memiliki objek besar dalam aplikasi yang jarang digunakan, Anda bisa menggunakan referensi lemah ke objek tersebut asalkan membuat ulang objek tersebut tidak mahal.

Perhatikan bahwa saat Anda membuat referensi lemah ke sebuah objek, IntPtr ke GCHandle disimpan secara internal oleh referensi lemah yang telah Anda buat. Runtime menggunakan GCHandle ini untuk mengelola tabel yang berisi referensi lemah ke objek. Jika sebuah objek telah dikumpulkan sampahnya, nilai IntPtr akan menjadi IntPtr.Zero. Ketika referensi lemah ke objek diselesaikan, entri terkait dari referensi lemah ke objek di tabel referensi lemah akan dihapus. Jika referensi lemah ke objek masih hidup dan Anda memanggil properti Target pada referensi lemah, objek sebenarnya yang ditunjukkan oleh GCHandle referensi lemah akan dikembalikan.

Membuat referensi yang lemah ke suatu objek tidak meningkatkan masa pakai objek tersebut. Ini memungkinkan pengumpul sampah untuk merebut kembali memori yang ditempati oleh objek ketika tidak ada referensi yang kuat ke objek tersebut. Perbedaan antara referensi yang lemah dan yang kuat ke suatu objek adalah bahwa meskipun referensi yang pertama masih memungkinkan pengumpul sampah untuk mendapatkan kembali memori yang ditempati oleh objek tersebut, referensi yang kuat ke suatu objek tidak memungkinkan pengumpul sampah untuk merebut kembali memori yang ditempati oleh. objek itu jika objek tersebut dapat dijangkau.

Pemrograman referensi lemah di C #

Untuk membuat referensi yang lemah, Anda perlu memanfaatkan kelas System.WeakReference. Setelah Anda membuat referensi lemah ke suatu objek, Anda dapat menggunakan properti Target dari referensi lemah yang telah Anda buat untuk memeriksa apakah objek asli masih hidup. Cuplikan kode berikut menunjukkan bagaimana Anda dapat membuat referensi lemah ke sebuah objek.

Rectangle rectangle = new Rectangle(15, 10);

var weakReference = new WeakReference(rectangle);

Anda dapat menggunakan properti IsAlive untuk memeriksa apakah referensi lemah ke objek tersebut masih hidup. Berikut daftar kode yang menggambarkan hal ini.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(15, 10);

            var weakReference = new WeakReference(rectangle);

            rectangle = null;

            bool isAlive = weakReference.IsAlive;

            if(isAlive)

            Console.WriteLine("The object is still alive");

            Console.Read();

        }

Jika referensi kuat ke objek tidak lagi tersedia, Anda dapat memanfaatkan properti Target dari referensi lemah untuk menggunakan objek seperti yang ditunjukkan dalam cuplikan kode yang diberikan di bawah ini.

bool isAlive = weakReference.IsAlive;

if(isAlive)

{

Rectangle rectangle = weakReference.Target as Rectangle;

//You can now use the rectangle object as usual

}

Referensi lemah berumur pendek dan panjang

Referensi yang lemah bisa berumur pendek atau panjang. Perbedaan utama antara referensi pendek dan lemah adalah bahwa sementara dalam kasus sebelumnya, properti Target dari referensi lemah menjadi nol jika GC mengambil kembali objek, dalam kasus terakhir referensi lemah panjang tetap hidup bahkan setelah GC berjalan, yaitu, itu bertahan dari siklus GC. Perhatikan bahwa Anda harus menggunakan referensi panjang yang lemah dengan hati-hati karena status objek tidak dapat diprediksi setelah finalisasi.

Intinya, Anda harus menggunakan referensi lemah pendek ketika Anda ingin menggunakan objek yang dalam keadaan dapat digunakan. Sebaliknya, referensi panjang yang lemah adalah pilihan yang baik ketika Anda ingin menggunakan objek terlepas dari statusnya. Untuk membuat referensi long weak, Anda harus meneruskan "true" sebagai parameter kedua ke konstruktor kelas WeakReference yang kelebihan beban sambil membuat referensi weak. Cuplikan kode berikut menggambarkan hal ini.

Rectangle rectangle = new Rectangle(15, 10);

var weakReference = new WeakReference(rectangle, true);