Mendefinisikan secara eksplisit tipe data variabel vs. menggunakan kata kunci 'var'? [Tutup]

35

Dalam C #, apakah saya didorong untuk menggunakan kata kunci var serba guna untuk setiap deklarasi variabel? Jika ya, apakah saya harus menyebutkan karakter khusus untuk nilai literal dalam deklarasi variabel seperti M untuk desimal dalam pernyataan berikut:

var myDecimal = 14.5M;

Jika ada bedanya, saya mencoba melakukan pengembangan web dengan C #.

wassimans
sumber
7
Memiliki selusin dupes di SO (di mana itu milik IMHO).
1
Pertanyaan yang sama datang ke C ++ dengan repurposing C ++ 0x auto.
David Thornley
5
Eric Lippert dari tim kompiler C # baru-baru ini membuat blog tentang ini: blogs.msdn.com/b/ericlippert/archive/2011/04/20/…
Tim Goodman
Ada enam miliar dupes dari pertanyaan ini.
DeadMG
@DeadMG yang membuat mereka enam miliar dan satu.
wassimans

Jawaban:

53

Ada banyak perselisihan tentang penggunaan var. Aturan umum saya adalah sebagai berikut.

  • Ketika tipenya jelas seperti ketika tangan kanan penugasan adalah konstruktor, gunakan var.
  • Ketika jenis ini kompleks untuk ditulis, seperti kueri LINQ (alasan untuk var di tempat pertama) gunakan var.
  • Untuk tipe ambivalen (Desimal Anda menjadi contoh) di mana Anda ingin memastikan bahwa variabel Anda diketik dengan benar, tuliskan.
  • Jenis anonim harus menggunakan var.
  • Dalam semua kasus lain, ketikkan jenisnya.

Pada dasarnya, tujuannya adalah untuk membuatnya lebih mudah untuk membaca kode. Jika Anda merasa bahwa var cukup karena tugasnya jelas, gunakan var. Gunakan nama tipe lengkap sebagai petunjuk bagi pembaca ketika Anda merasa perlu.

Michael Brown
sumber
9
Saya juga menggunakan 'var' dalam foreachpernyataan di mana saya hanya peduli tentang penghitungan koleksi, tidak harus tentang jenis setiap item.
Adam Lear
1
Dan seperti yang ditunjukkan Jesse tipe anonim;)
Michael Brown
4
@AnnaLear terkadang Anda harus peduli. foreach (baris var di datatable.Rows) dalam hal ini var adalah objek bukan DataRow seperti yang diharapkan.
Thanos Papathanasiou
@HanosPapathanasiou Tentu, ya. Hal yang sama berlaku untuk koleksi Kontrol di Formulir Windows dan mungkin situasi lainnya juga.
Adam Lear
Saya biasanya menggunakan var kecuali ketika saya ingin memastikan jenis variabel saya (seperti ketika saya ingin memastikan bahwa nilainya dua kali lipat misalnya)
eka808
14

Kapan menggunakan varadalah pemrograman "perang suci". Tepatnya ada satu tempat di mana diperlukan: ketika hasil operasi membuat jenis anonim, seperti:

var result = new { Name = "John", Age = 35 };

Di tempat lain, itu opsional dan benar-benar sesuai dengan standar pengkodean Anda untuk menggunakannya atau tidak dalam situasi lain.

Dan ya, Anda akan memerlukan karakter khusus untuk literal agar kompiler tahu apa itu di sisi kanan. Dalam contoh Anda, tanpa M, standarnya adalah doublebukan decimal.

Jesse C. Slicer
sumber
1
lupa semua tentang jenis anonim!
Michael Brown
Di pekerjaan terakhir saya, saya diberi tahu bahwa saya akan dipecat jika saya terus menggunakan kata kunci "var" ...
hanzolo
Itu ekstrem, tetapi inisiatif perusahaan Anda. Senang itu pekerjaan "terakhir" Anda, meskipun! :)
Jesse C. Slicer
7

Dari MSDN :

Namun, penggunaan var setidaknya memiliki potensi untuk membuat kode Anda lebih sulit dipahami oleh pengembang lain. Karena alasan itu, dokumentasi C # umumnya menggunakan var hanya saat diperlukan.

Saya benar-benar tidak suka mengetik secara implisit. Di permukaan itu cenderung membuat kode lebih mudah dibaca, tetapi dapat menyebabkan banyak masalah di jalan. Jika dev mengubah penginisialisasi variabel, katakanlah, dari

var myFloat=100f;

untuk

var myFloat=100;

atau

var myFloat=100.0;

Jenisnya akan berubah, menghasilkan seluruh kesalahan kompiler atau, jika itu dalam tampilan web dan Anda tidak menggunakan langkah post-build untuk mengkompilasi pandangan Anda, seluruh kesalahan runtime yang tidak akan ditangkap tanpa efektif pengujian pra-penempatan.

Mengetik tersirat juga tidak berfungsi di mana-mana (dari tautan MSDN yang sama)

var hanya dapat digunakan ketika variabel lokal dideklarasikan dan diinisialisasi dalam pernyataan yang sama; variabel tidak dapat diinisialisasi ke nol, atau ke grup metode atau fungsi anonim.

var tidak dapat digunakan pada bidang di lingkup kelas.

Variabel yang dideklarasikan dengan menggunakan var tidak dapat digunakan dalam ekspresi inisialisasi. Dengan kata lain, ungkapan ini sah: int i = (i = 20); tetapi ungkapan ini menghasilkan kesalahan waktu kompilasi: var i = (i = 20);

Beberapa variabel yang diketik secara implisit tidak dapat diinisialisasi dalam pernyataan yang sama.

Jika jenis bernama var berada dalam ruang lingkup, maka kata kunci var akan memutuskan untuk nama tipe itu dan tidak akan diperlakukan sebagai bagian dari deklarasi variabel lokal yang diketik secara implisit.

Menjaga kode Anda konsisten (dalam hal ini, menggunakan pengetikan eksplisit di mana-mana) adalah hal yang sangat, sangat baik. Menurut pendapat saya, varmalas dan tidak memberikan manfaat nyata, dan memperkenalkan titik kegagalan potensial lain dalam proses yang sudah kompleks.

Pembaruan 2017

Saya benar-benar berubah pikiran. Ketika bekerja di C #, saya menggunakan varsebagian besar waktu (kecuali hal-hal seperti variabel tipe antarmuka dan semacamnya). Itu membuat kode singkat yang meningkatkan keterbacaan. Namun, tetap - perhatikan apa jenis sebenarnya diselesaikan.

3Dave
sumber
Ingin tahu apa yang berubah pikiran, @ 3Dave. Saya masih 100% setuju dengan poin awal Anda: "var malas dan tidak memberikan manfaat nyata, dan memperkenalkan potensi titik kegagalan lain dalam proses yang sudah rumit".
Dan
@ Dan Itu benar-benar turun ke keterbacaan. Pengembang yang kompeten dapat dengan cepat menentukan apa yang ada di sisi inisialisasi deklarasi tanpa masalah. Sama seperti tidak menggunakan di this.mana - mana, atau mengatakan System.Blah.SomeTypealih-alih using, yang menurut saya masih sangat mengganggu, kode yang lebih singkat adalah - setidaknya bagi saya - biasanya lebih mudah diurai secara visual. Masih banyak skenario di mana pengetikan eksplisit adalah pilihan yang tepat. Tapi, akhir-akhir ini aku kurang sebagai pengacara bahasa daripada seseorang yang hanya berusaha mendapatkan kode bersih dari pintu.
3Dave
@Dan (Tentu saja, saya juga orang yang menggunakan using namespace std;dalam file .cpp. (Bukan header, karena saya lebih suka untuk menghindari terpal dan berbulu.)
3Dave
3

Referensi C # menunjukkan yang berikut untuk menggambarkan penggunaan yang baik vs buruk dari konstruksi ini:

Contoh berikut menunjukkan dua ekspresi kueri. Dalam ekspresi pertama, penggunaan var diizinkan tetapi tidak diperlukan, karena jenis hasil kueri dapat dinyatakan secara eksplisit sebagai IEnumerable. Namun, dalam ekspresi kedua, var harus digunakan karena hasilnya adalah kumpulan tipe anonim, dan nama tipe itu tidak dapat diakses kecuali ke kompiler itu sendiri. Perhatikan bahwa dalam Contoh # 2, item variabel iterasi foreach juga harus diketik secara implisit.

 // Example #1: var is optional because 
    // the select clause specifies a string 
    string[] words = { "apple", "strawberry", "grape", "peach", "banana" };
    var wordQuery = from word in words
                    where word[0] == 'g'
                    select word;

    // Because each element in the sequence is a string,  
    // not an anonymous type, var is optional here also. 
    foreach (string s in wordQuery)
    {
        Console.WriteLine(s);
    }

    // Example #2: var is required because 
    // the select clause specifies an anonymous type 
    var custQuery = from cust in customers
                    where cust.City == "Phoenix" 
                    select new { cust.Name, cust.Phone };

    // var must be used because each item  
    // in the sequence is an anonymous type 
    foreach (var item in custQuery)
    {
        Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
    }
Thulani Chivandikwa
sumber
0

Kata kunci var hanya meminta kompiler untuk menyimpulkan tipe variabel tipe var secara otomatis. Oleh karena itu, jika Anda ingin menyimpan variabel tipe desimal dalam variabel var, Anda harus menggunakan m. Demikian juga jika Anda menyimpan string, Anda harus menyertakannya dalam tanda kutip.

Programmer komputer
sumber
0

Bagi saya, saya tidak menggunakan var untuk kasus-kasus berikut:

  • Ketika saya ingin memastikan jenis variabel saya (misalnya untuk memastikan bahwa jenis yang digunakan adalah ganda dan bukan desimal, dan ini adalah masalah besar percayalah!)
  • Kode polimorfik seperti Fruit foo = new Apple();. Dalam hal ini, saya pikir var adalah untuk menghindari dan menggunakan kelas induk (di sini Buah) lebih baik dengan memungkinkan pemahaman yang lebih baik tentang logika kode dan batasan bug yang mungkin (Dengan var, tidak ada pemeriksaan konsep polimorfik!)

Untuk selebihnya, saya pikir ini tergantung pada kasus dan latar belakang pengembang. Beberapa orang dari dunia PHP lebih suka tidak merawat tipe variabel, dan beberapa orang dari dunia Java hanya akan berpikir bahwa var adalah bid'ah dan semakin banyak verbose semakin baik.

Anda harus membuat opini pribadi Anda :)

eka808
sumber