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
static ref int Max(ref int x, ref int y)
{
if (x > y)
return ref x;
else
return ref y;
}
dan kemudian menyebutnya dengan
int a = 123;
int b = 456;
ref int c = ref Max(ref a, ref b);
c += 100;
Console.WriteLine(b); // 556!
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:
ref int M1(ref int x)
{
return ref x;
}
ref int M2()
{
int y = 123;
return ref M1(ref y); // Trouble!
}
int M3()
{
ref int z = ref M2();
return z;
}
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 ++? )