C # menyediakan ref
dan out
kata kunci untuk membuat argumen untuk dilewatkan dengan referensi. Semantik keduanya sangat mirip. Satu-satunya perbedaan adalah dalam inisialisasi dari variabel yang digerakkan:
ref
membutuhkan variabel yang diinisialisasi sebelum meneruskannya ke fungsi,out
tidak.out
membutuhkan variabel yang diinisialisasi di dalam fungsi,ref
tidak.
Kasus penggunaan kedua kata kunci ini juga hampir sama, dan penggunaannya yang terlalu sering saya percaya dianggap sebagai bau kode (meskipun ada kasus penggunaan yang valid seperti TryParse
dan TryGetValue
pola).
Karena ini dapatkah seseorang menjelaskan, mengapa ada dua alat yang sangat mirip dalam C # untuk kasus penggunaan yang begitu sempit?
Juga, pada MSDN , dinyatakan bahwa mereka memiliki perilaku run-time yang berbeda:
Meskipun kata kunci ref dan out menyebabkan perilaku run-time yang berbeda, mereka tidak dianggap sebagai bagian dari tanda tangan metode pada waktu kompilasi.
Bagaimana perilaku run-time mereka berbeda?
Kesimpulan
Kedua jawaban terlihat benar, terima kasih keduanya. Saya menerima jmoreno karena lebih eksplisit.
ref
di C ++; ke pointer ke penunjuk objek (atau primitif) yang dimaksud. yaituInt32.TryParse(myStr, out myInt)
(C #) "dieksekusi" dengan cara yang sama sepertiint32_tryParse(myStr, &myInt)
(C); satu-satunya perbedaan adalah beberapa kendala yang diberlakukan oleh kompiler untuk mencegah bug. (Saya tidak akan memposting ini sebagai jawaban karena saya mungkin salah tentang bagaimana ini bekerja di belakang layar, tetapi ini adalah bagaimana saya membayangkan itu bekerja [karena masuk akal])