Penyelaman mendalam: Jenis nilai dan referensi di .Net

Jenis di Microsoft .Net dapat berupa jenis nilai atau jenis referensi. Meskipun tipe nilai umumnya disimpan di tumpukan, tipe referensi disimpan di heap terkelola.

Jenis nilai berasal dari System.ValueType dan berisi data di dalam alokasi memorinya sendiri. Dengan kata lain, variabel atau objek atau tipe nilai memiliki salinan datanya sendiri.

Jenis referensi, sementara itu, memperluas System.Object dan menunjuk ke lokasi di memori yang berisi data aktual. Anda dapat membayangkan tipe referensi yang mirip dengan pointer yang secara implisit direferensikan saat Anda mengaksesnya. Jenis referensi bawaan yang didukung oleh C # meliputi: objek, string, dan dinamis. Semua tipe data fundamental, Boolean, Date, struct, dan enum adalah contoh tipe nilai. Contoh tipe referensi meliputi: string, array, objek kelas, dll. Untuk membuat tipe referensi di C #, Anda dapat memanfaatkan kata kunci berikut: class, interface dan delegate.

Perhatikan bahwa tidak seperti tipe referensi, Anda tidak dapat memperoleh dari tipe nilai, Anda juga tidak dapat menetapkan nilai null secara langsung ke tipe nilai. Anda dapat menetapkan nilai null ke jenis nilai hanya dengan memanfaatkan jenis nullable - fitur yang ditambahkan ke versi .Net Framework yang lebih baru. Ketika tipe nilai disalin ke yang lain, nilainya disalin. Karenanya, Anda dapat memanipulasi nilai di dalamnya secara independen dari yang lain - perubahan yang satu tidak memengaruhi yang lain. Sebaliknya, saat Anda menyalin tipe referensi ke yang lain, referensi tersebut akan disalin. Jika Anda mengubah salah satunya, yang lain juga terpengaruh. Sebagai contoh, jika salah satu referensi disetel ke null, referensi lainnya juga menjadi null.

Lokasi penyimpanan

CLR menyimpan objek di tiga jenis lokasi penyimpanan - register, stack, atau heap terkelola. Sementara objek berumur pendek disimpan di dalam register atau stack, objek berumur panjang disimpan di heap. Seperti yang saya sebutkan sebelumnya, tipe nilai umumnya disimpan di tumpukan.

Ini adalah kesalahpahaman umum bahwa tipe nilai selalu disimpan di tumpukan. Saya lebih suka mengatakan bahwa tipe nilai dapat disimpan dalam tumpukan ketika variabel tersebut merupakan variabel sementara atau variabel lokal dan kompilator JIT memutuskan untuk tidak mendaftarkan nilai. Intinya, lokasi sebenarnya dari tipe nilai bergantung pada implementasi compiler JIT. Perhatikan bahwa tipe nilai dapat disimpan dalam bingkai tumpukan, di register CPU atau bahkan di memori heap jika tipe nilai terdapat di dalam objek, yaitu, jika itu adalah bagian dari tipe referensi. Sebaliknya, jenis referensi disimpan di heap GC. Referensi disimpan dalam tumpukan sementara objek dialokasikan di heap.

Instance atau referensi dari tipe nilai disimpan di stack, register atau di heap tergantung pada apakah masa pakai instance atau referensi berumur pendek atau panjang. Tipe nilai bisa berada di tumpukan jika mereka adalah variabel lokal dan dalam tumpukan terkelola jika mereka adalah bidang kelas, yaitu, mereka milik atau merupakan bagian dari tipe referensi.

Melewati nilai dan melewati referensi

Daftar kode berikut mengilustrasikan bagaimana Anda dapat mengirimkan variabel ke metode berdasarkan nilai.

 static void Increment(int i)

        {

            i = i + 1;

        }

        static void Main()

        {

            int x = 1;

            Increment(x);

            Console.WriteLine("The value of x is: " +x);

            Console.Read();

        }

Perhatikan bahwa Anda dapat mengirimkan tipe nilai sebagai referensi ke metode dengan menggunakan kata kunci ref. Daftar kode berikut menggambarkan hal ini.

static void Increment(ref int i)

        {

            i = i + 1;

        }

        static void Main()

        {

            int x = 1;

            Increment(ref x);

            Console.WriteLine("The value of x is: " +x);

            Console.Read();

        }

Ketika kode di atas dijalankan, pesan "Nilai x adalah: 2" akan ditampilkan di konsol.

Tinju dan unboxing

Konversi jenis nilai ke jenis referensi dikenal sebagai tinju. Pembongkaran adalah kebalikannya - ini didefinisikan sebagai proses konversi dari jenis referensi ke jenis nilai. Potongan kode berikut menggambarkan tinju dan unboxing di C #.

int i = 100;

Object obj = i; //Boxing

i = (int) obj; //Unboxing