Saya telah membaca bahwa .NET mendukung pengembalian referensi, tetapi C # tidak. Apakah ada alasan khusus? Mengapa saya tidak bisa melakukan sesuatu seperti:
static ref int Max(ref int x, ref int y)
{
if (x > y)
return ref x;
else
return ref y;
}
c#
.net
reference
return-type
Tom Sarduy
sumber
sumber
return ref x
C# 7
:)Jawaban:
Pertanyaan ini adalah topik blog saya pada 23 Juni 2011 . Terima kasih atas pertanyaannya!
Tim C # sedang mempertimbangkan ini untuk C # 7. Lihat https://github.com/dotnet/roslyn/issues/5233 untuk detailnya.
UPDATE: Fitur ini membuatnya menjadi C # 7!
Anda benar; .NET mendukung metode yang mengembalikan referensi terkelola ke variabel. .NET juga mendukung variabel lokal yang berisi referensi terkelola ke variabel lain. (Namun perlu dicatat bahwa .NET tidak mendukung bidang atau array yang berisi referensi terkelola ke variabel lain karena terlalu menyulitkan kisah pengumpulan sampah. Juga tipe "referensi terkelola ke variabel" tidak dapat dikonversi ke objek , dan oleh karena itu tidak dapat digunakan sebagai ketik argumen ke tipe atau metode umum.)
Komentator "RPM1984" karena alasan tertentu meminta kutipan untuk fakta ini. RPM1984 Saya mendorong Anda untuk membaca spesifikasi CLI Partisi I Bagian 8.2.1.1, "Pointer terkelola dan tipe terkait" untuk informasi tentang fitur .NET ini.
Sangat mungkin untuk membuat versi C # yang mendukung kedua fitur ini. Anda kemudian dapat melakukan hal-hal seperti
dan kemudian menyebutnya dengan
Saya tahu secara empiris bahwa adalah mungkin untuk membangun versi C # yang mendukung fitur-fitur ini karena saya telah melakukannya . Pemrogram tingkat lanjut, terutama orang yang melakukan porting kode C ++ yang tidak dikelola, sering meminta kami untuk lebih banyak C ++ - seperti kemampuan untuk melakukan sesuatu dengan referensi tanpa harus keluar dari palu besar yang sebenarnya menggunakan pointer dan menyematkan memori di semua tempat. Dengan menggunakan referensi terkelola, Anda mendapatkan manfaat ini tanpa membayar biaya mengacaukan kinerja pengumpulan sampah Anda.
Kami telah mempertimbangkan fitur ini, dan benar-benar menerapkannya untuk menunjukkan kepada tim internal lain untuk mendapatkan umpan balik mereka. Namun pada saat ini berdasarkan penelitian kami, kami percaya bahwa fitur tersebut tidak memiliki daya tarik yang cukup luas atau kasus penggunaan yang memaksa untuk menjadikannya fitur bahasa yang didukung nyata . Kami memiliki prioritas lain yang lebih tinggi dan waktu dan upaya yang terbatas, sehingga kami tidak akan melakukan fitur ini dalam waktu dekat.
Juga, melakukannya dengan benar akan memerlukan beberapa perubahan pada CLR. Saat ini CLR memperlakukan metode pengembalian kembali sebagai sah tetapi tidak dapat diverifikasi karena kami tidak memiliki detektor yang mendeteksi situasi ini:
M3 mengembalikan konten variabel lokal M2, tetapi masa pakai variabel itu telah berakhir! Dimungkinkan untuk menulis detektor yang menentukan penggunaan pengembalian-kembali yang jelas-jelas tidak melanggar keselamatan tumpukan. Apa yang akan kami lakukan adalah menulis detektor seperti itu, dan jika detektor tidak dapat membuktikan keamanan tumpukan, maka kami tidak akan mengizinkan penggunaan pengembalian ref di bagian program tersebut. Ini bukan pekerjaan dev yang sangat besar untuk melakukannya, tetapi banyak sekali beban bagi tim penguji untuk memastikan bahwa kami benar-benar mendapatkan semua kasing. Ini hanyalah hal lain yang meningkatkan biaya fitur ke titik di mana sekarang manfaatnya tidak melebihi biaya.
Jika Anda dapat menjelaskan kepada saya mengapa Anda menginginkan fitur ini, saya akan sangat menghargai itu . Semakin banyak informasi yang kami dapatkan dari pelanggan nyata tentang mengapa mereka menginginkannya, semakin besar kemungkinan itu akan membuatnya menjadi produk suatu hari nanti. Ini fitur kecil yang lucu dan saya ingin bisa memberikannya kepada pelanggan entah bagaimana jika ada minat yang cukup.
(Lihat juga pertanyaan terkait Apakah Mungkinkah Mengembalikan Referensi ke Variabel dalam C #? Dan Dapatkah saya menggunakan referensi di dalam fungsi C # seperti C ++? )
sumber
y
hidup setelah kembali dariM2
? Saya berharap fitur ini berfungsi seperti lambda menangkap penduduk lokal. Atau perilaku yang Anda ajukan karena bagaimana CLR menangani skenario itu?Anda berbicara tentang metode yang mengembalikan referensi ke tipe nilai. Satu-satunya contoh bawaan dalam C # yang saya ketahui adalah array-accessor dari tipe nilai:
dan sekarang buat array dari struct itu:
Dalam hal ini
points[0]
, pengindeks array , mengembalikan referensi ke struct. Tidak mungkin untuk menulis pengindeks Anda sendiri (misalnya untuk koleksi khusus), yang memiliki perilaku "mengembalikan referensi" yang sama.Saya tidak merancang bahasa C # jadi saya tidak tahu semua alasan di balik tidak mendukungnya, tapi saya pikir jawaban singkatnya adalah: kita bisa bergaul baik tanpa itu.
sumber
Anda selalu dapat melakukan sesuatu seperti:
sumber
C # 7.0 memiliki dukungan untuk referensi yang dikembalikan. Lihat jawaban saya di sini .
sumber