Saya mengerti bahwa jika saya meneruskan tipe-nilai ( int
,, struct
dll.) Sebagai parameter (tanpa ref
kata kunci), salinan variabel tersebut diteruskan ke metode, tetapi jika saya menggunakan ref
kata kunci, referensi ke variabel tersebut diteruskan, bukan yang baru.
Tetapi dengan tipe referensi, seperti kelas, bahkan tanpa ref
kata kunci, referensi diteruskan ke metode, bukan salinan. Jadi apa gunanya ref
kata kunci dengan tipe referensi?
Ambil contoh:
var x = new Foo();
Apa perbedaan antara yang berikut ini?
void Bar(Foo y) {
y.Name = "2";
}
dan
void Bar(ref Foo y) {
y.Name = "2";
}
c#
parameters
pass-by-reference
pass-by-value
Andreas Grech
sumber
sumber
Ada kasus di mana Anda ingin memodifikasi referensi yang sebenarnya dan bukan objek yang diarahkan:
sumber
Jon Skeet menulis artikel yang bagus tentang melewati parameter dalam C #. Ini merinci dengan jelas perilaku yang tepat dan penggunaan parameter lewat oleh nilai, dengan referensi (
ref
), dan oleh output (out
).Berikut ini kutipan penting dari halaman tersebut terkait dengan
ref
parameter:sumber
Dijelaskan dengan sangat baik di sini: http://msdn.microsoft.com/en-us/library/s6938f28.aspx
Abstrak dari artikel:
sumber
Saat Anda melewati jenis referensi dengan kata kunci ref, Anda meneruskan referensi dengan referensi, dan metode yang Anda panggil dapat menetapkan nilai baru ke parameter. Perubahan itu akan menyebar ke lingkup panggilan. Tanpa ref, referensi dilewatkan oleh nilai, dan ini tidak terjadi.
C # juga memiliki kata kunci 'keluar' yang sangat mirip dengan ref, kecuali bahwa dengan 'ref', argumen harus diinisialisasi sebelum memanggil metode, dan dengan 'out' Anda harus memberikan nilai dalam metode penerimaan.
sumber
Ini memungkinkan Anda untuk memodifikasi referensi yang diteruskan. Mis
Anda juga dapat menggunakan keluar jika Anda tidak peduli tentang referensi disahkan pada:
sumber
Kumpulan kode lain
sumber
Selain jawaban yang ada:
Saat Anda meminta perbedaan kedua metode: Tidak ada varian co (ntra) saat menggunakan
ref
atauout
:sumber
Parameter dalam metode tampaknya selalu melewati salinan, pertanyaannya adalah salinan apa. Salinan dilakukan oleh copy constructor untuk suatu objek dan karena semua variabel adalah Object di C #, saya percaya ini adalah kasus untuk semuanya. Variabel (objek) seperti orang yang tinggal di beberapa alamat. Kami dapat mengubah orang-orang yang tinggal di alamat-alamat itu atau kami dapat membuat lebih banyak referensi untuk orang-orang yang tinggal di alamat-alamat itu dalam buku telepon (membuat salinan yang dangkal). Jadi, lebih dari satu pengidentifikasi dapat merujuk ke alamat yang sama. Tipe referensi menginginkan lebih banyak ruang, jadi tidak seperti tipe nilai yang secara langsung dihubungkan oleh panah ke pengidentifikasi mereka di stack, mereka memiliki nilai untuk alamat lain di heap (ruang yang lebih besar untuk dihuni). Ruang ini perlu diambil dari tumpukan.
Jenis nilai: Indentifier (berisi nilai = alamat nilai tumpukan) ----> Nilai jenis nilai
Jenis referensi: Identifier (berisi nilai = alamat nilai tumpukan) ----> (berisi nilai = alamat nilai tumpukan) ----> Nilai tumpukan (paling sering berisi alamat ke nilai lain), bayangkan lebih banyak panah menempel di berbagai arah ke Array [0], Array [1], array [2]
Satu-satunya cara untuk mengubah nilai adalah dengan mengikuti panah. Jika satu panah hilang / berubah dengan cara nilainya tidak dapat dijangkau.
sumber
Variabel Referensi membawa alamat dari satu tempat ke tempat lain sehingga setiap pembaruan pada mereka di tempat mana pun akan mencerminkan semua tempat LALU apa gunanya REF. Variabel referensi (405) baik sampai tidak ada memori baru yang dialokasikan ke variabel referensi yang diteruskan dalam metode.
Setelah alokasi memori baru (410) maka perubahan nilai pada objek ini (408) tidak akan mencerminkan di mana-mana. Untuk ref ini datang. Ref adalah referensi referensi sehingga setiap kali memori baru mengalokasikannya akan tahu karena menunjuk ke lokasi itu sehingga nilainya dapat dibagikan oleh setiap orang. Anda dapat melihat gambar untuk lebih jelas.
sumber