Saya akan mencoba penjelasan saya:
Saya pikir kita mengerti bagaimana tipe nilai bekerja dengan benar? Jenis nilai adalah (int, long, struct dll). Ketika Anda mengirim mereka ke suatu fungsi tanpa perintah ref itu COPIES data . Apa pun yang Anda lakukan terhadap data itu dalam fungsi hanya memengaruhi salinan, bukan yang asli. Perintah ref mengirimkan data AKTUAL dan setiap perubahan akan memengaruhi data di luar fungsi.
Oke ke bagian yang membingungkan, jenis referensi:
Mari kita buat jenis referensi:
List<string> someobject = new List<string>()
Saat Anda baru memulai suatu objek , dua bagian dibuat:
- Blok memori yang menampung data beberapa objek .
- Referensi (penunjuk) ke blok data itu.
Sekarang ketika Anda mengirim objek ke suatu metode tanpa ref COPIES itu adalah referensi pointer, BUKAN data. Jadi sekarang Anda memiliki ini:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Dua referensi menunjuk ke objek yang sama. Jika Anda memodifikasi properti pada suatu objek menggunakan reference2 itu akan mempengaruhi data yang sama yang ditunjukkan oleh reference1.
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Jika Anda membatalkan referensi2 atau mengarahkannya ke data baru, itu tidak akan mempengaruhi reference1 atau data reference1 menunjuk ke.
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
Sekarang apa yang terjadi ketika Anda mengirim objek dengan ref ke suatu metode? The referensi aktual untuk SomeObject akan dikirim ke metode. Jadi sekarang Anda hanya memiliki satu referensi ke data:
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
Tapi apa artinya ini? Kerjanya persis sama dengan mengirim objek bukan oleh ref kecuali untuk dua hal utama:
1) Ketika Anda membatalkan referensi di dalam metode itu akan membatalkan yang di luar metode.
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) Sekarang Anda dapat mengarahkan referensi ke lokasi data yang sama sekali berbeda dan referensi di luar fungsi sekarang akan menunjuk ke lokasi data baru.
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true
MyClass
akan menjadiclass
tipe, yaitu tipe referensi. Dalam hal itu, objek yang Anda lewati dapat dimodifikasi olehmyFunction
genap tanparef
/out
kata kunci.myFunction
akan menerima referensi baru yang menunjuk ke objek yang sama , dan dapat memodifikasi objek yang sama sebanyak yang diinginkan. Perbedaanref
kata kunci akan membuat, akanmyFunction
menerima referensi yang sama untuk objek yang sama. Itu akan menjadi penting hanya jikamyFunction
mengubah referensi untuk menunjuk ke objek lain .