Setelah berdiskusi dengan kolega mengenai penggunaan kata kunci 'var' di C # 3, saya bertanya-tanya pendapat orang apa tentang penggunaan inferensi tipe yang tepat melalui var?
Misalnya saya agak malas menggunakan var dalam keadaan yang dipertanyakan, misalnya: -
foreach(var item in someList) { // ... } // Type of 'item' not clear.
var something = someObject.SomeProperty; // Type of 'something' not clear.
var something = someMethod(); // Type of 'something' not clear.
Penggunaan var yang lebih sah adalah sebagai berikut: -
var l = new List<string>(); // Obvious what l will be.
var s = new SomeClass(); // Obvious what s will be.
Menariknya LINQ tampaknya agak abu-abu, misalnya: -
var results = from r in dataContext.SomeTable
select r; // Not *entirely clear* what results will be here.
Jelas hasil apa yang akan di bahwa itu akan menjadi tipe yang mengimplementasikan IEnumerable, namun itu tidak sepenuhnya jelas dengan cara yang sama seperti var mendeklarasikan objek baru.
Ini bahkan lebih buruk ketika datang ke LINQ ke objek, misalnya: -
var results = from item in someList
where item != 3
select item;
Ini tidak lebih baik daripada equivilent foreach (item var di someList) {// ...} equivilent.
Ada kekhawatiran nyata tentang keamanan jenis di sini - misalnya jika kita menempatkan hasil kueri ke dalam metode kelebihan beban yang menerima IEnumerable <int> dan IEnumerable <double> pemanggil mungkin secara tidak sengaja mengirimkan tipe yang salah.
var
memang mempertahankan pengetikan yang kuat tetapi pertanyaannya adalah apakah berbahaya bagi jenis untuk tidak segera terlihat pada definisi, sesuatu yang diperbesar ketika kelebihan berarti kesalahan kompiler mungkin tidak dikeluarkan ketika Anda tidak sengaja melewati jenis yang salah ke suatu metode.
var i = 0;
== gagal! var c = new CrazyFrigginLongClassName();
== menang!
var readabilityBeDamned = true;