Mengapa C # memiliki keduanya dan ref?

18

C # memiliki outdan refkata kunci. Mengapa keduanya diperlukan? Penafian: Saya tidak memiliki pengetahuan mendalam tentang C #.

Neo
sumber
3
Apakah tidak ada duplikat lintas-situs di Stack Overflow?
Peter Mortensen
2
Apakah Anda meminta perbedaan antara refdan out? Atau apakah Anda bertanya apa penggunaan argumen referensi ref/ outdibandingkan dengan argumen nilai-(tidak ada pengubah ke parameter)? Atau keduanya?
Jeppe Stig Nielsen
1
Saya merasa pertanyaan ini mirip, tetapi tidak cukup dup - setidaknya jika diambil dari perspektif desain bahasa
jmoreno

Jawaban:

32

Dari segi implementasi, mereka pada dasarnya adalah hal yang sama, tetapi outmengkomunikasikan sesuatu yang reftidak: Anda tidak peduli tentang input. Ini berarti hal-hal tertentu bagi Anda dan perkakas. Misalnya, Anda bisa meneruskan variabel yang tidak diinisialisasi ke outparameter dan itu bukan masalah, di mana sebaliknya, dan dalam fungsi Anda diharuskan untuk menetapkan nilai ke outparameter sebelum kembali, sedangkan tidak ada persyaratan untuk melakukan apa pun di semua dengan refnilai.

Mason Wheeler
sumber
10
Ref vs out jauh lebih penting untuk kompiler daripada programmer. Kompiler wajib memastikan Anda tidak membaca variabel sebelum diberi nilai, dan outmemberinya cara untuk melakukannya sehingga lebih cocok dengan bagaimana Anda ingin berurusan dengan variabel di tempat pertama.
Cort Ammon - Reinstate Monica
Bisakah Anda jelaskan tentang: 'out' mengkomunikasikan sesuatu yang 'ref' tidak.
Neo
4
@Neo: Pada dasarnya apa yang saya katakan dalam jawaban: Ini mengkomunikasikan bahwa Anda tidak peduli menggunakan ini untuk input, dan dengan demikian aman untuk meneruskan nilai yang tidak diinisialisasi ke outparam karena fungsi yang menerimanya tidak akan membaca dari itu .
Mason Wheeler
@MasonWheeler Apakah ini dibolehkan (dan / atau diberlakukan pada sisi penerima) oleh verifikasi? Keluar hanyalah atribut, secara internal.
Random832
@ Random832: Ketika Robert memposting di bawah jawabannya, lihat Eric Lippert (mantan kompiler C #) yang mendiskusikan hal ini di stackoverflow.com/q/2876315
Mason Wheeler
7

Untuk memahami dua kata kunci ini, Anda harus memahami apa artinya memberikan nilai dengan referensi . Pada dasarnya itu berarti bahwa, jika Anda memodifikasi variabel parameter yang Anda berikan dalam metode atau fungsi, variabel itu mempertahankan nilai yang dimodifikasi ketika fungsi Anda keluar. Mendeklarasikan parameter sebagai refatau outmenyelesaikan ini, sedangkan variabel parameter biasa akan mempertahankan nilai aslinya, bahkan jika Anda mengubahnya dalam fungsi.

Satu-satunya perbedaan antara refdan outadalah bahwa outtidak mengharuskan Anda untuk menginisialisasi variabel sebelum Anda meneruskannya ke fungsi, tetapi reftidak; sementara out memang mengharuskan Anda untuk menetapkan sesuatu ke variabel dalam fungsi, tetapi reftidak.

Robert Harvey
sumber
Apakah tidak ada perbedaan terkait dengan varians?
monocell
Lihat jawaban Eric Lippert di stackoverflow.com/q/2876315
Robert Harvey
2

Kamu bertanya.

C # sudah keluar dan ref, mengapa keduanya diperlukan. Saya tidak memiliki pengetahuan mendalam tentang C #. Mengapa parameter keluar dan ref diperlukan?

Dan jawabannya adalah bahwa mereka TIDAK DIBUTUHKAN, java misalnya tidak memiliki salah satu dan VB hanya memiliki ref (dan hanya membutuhkannya dalam deklarasi metode).

Anda dapat dengan mudah menulis seluruh program tanpa menggunakan keduanya.

Mereka ada karena mereka kadang berguna. Itulah sebabnya ada dua dari mereka dan bukan hanya satu - karena berguna untuk membuat perbedaan antara 'di sini adalah sesuatu, modifikasi jika Anda mau' dan 'berikan nilai baru pada benda ini'.

Bahasa lain memiliki prioritas yang berbeda dan mungkin juga tidak termasuk ini atau yang setara. Mereka bahkan mungkin tidak setuju apakah keduanya bermanfaat, dan karenanya dapat secara aktif memutuskan TIDAK untuk menerapkan satu atau yang lain.

jmoreno
sumber
1

Pada intinya keduanya refdan outmenyediakan mekanisme untuk meneruskan alamat variabel ke suatu metode sehingga dapat diperbarui - menugaskan refatau outparameter memperbarui variabel dalam konteks pemanggil. Perbedaannya ada pada jaminan: outjaminan bahwa variabel akan diperbarui, reftidak.

Dari sisi lain panggilan ada perbedaan yang sama. Sebuah outparameter untuk metode kami tidak dijamin mengandung sesuatu yang berguna pada saat kedatangan dan harus diatur ke nilai di beberapa titik, sementara refparameter dapat diasumsikan memiliki nilai dan kita tidak perlu melakukan sesuatu yang spesifik dengan itu.

Perbedaan ini berdampak pada analisis kode, pembangkitan, dan pengoptimalan yang, meskipun tidak terlalu jelas bagi kita sebagian besar waktu, dapat memiliki beberapa efek pada cara program kita pada akhirnya beroperasi. Pembuat kode dapat menunda alokasi variabel sampai segera sebelum panggilan, pengoptimal mungkin memutuskan dapat menyusun ulang beberapa operasi lebih efektif berdasarkan kontrak, dll.

Dalam hal penggunaan: sebagai aturan umum saya gunakan outuntuk situasi di mana saya tidak peduli tentang konten variabel ketika tiba sebagai parameter dan refketika saya melakukannya.

Corey
sumber