Saya baru saja mulai menggunakan ReSharper dengan Visual Studio (setelah banyak rekomendasi tentang SO). Untuk mencobanya saya membuka proyek ASP.NET MVC baru-baru ini. Salah satu hal pertama dan yang paling sering saya perhatikan adalah menyarankan untuk mengubah sebagian / semua deklarasi eksplisit saya var
sebagai gantinya. Sebagai contoh:
//From This:
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
//To This:
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
dan sebagainya, bahkan dengan jenis sederhana seperti int
, bool
, dll
Mengapa ini direkomendasikan? Saya tidak berasal dari ilmu komputer atau .NET latar belakang, setelah "jatuh ke dalam" pengembangan. NET baru-baru ini, jadi saya benar-benar ingin memahami apa yang terjadi dan apakah itu bermanfaat atau tidak.
var
, bahkan ketika tipenya tidak jelas sama sekali! alasannya adalah karena memaksa saya untuk memilih nama yang paling deskriptif yang bisa saya buat dan akhirnya membuat kode jauh, lebih mudah dibaca. Pada akhirnya itu juga membantu memisahkan logika dari implementasi. Tentu saja itu hanya pendapat saya, saya harap ini akan membantu seseorang;).Jawaban:
Salah satu alasannya adalah peningkatan keterbacaan. Mana yang lebih baik?
atau
sumber
var
untuk segala sesuatu - saya lakukan banyak dan banyak ulasan kode menggunakan TFS (diffs berbasis web) dan itu membuat pekerjaan saya sangat sulit: yaituvar items = GetSomeItems();
vsIDataReader dr = GetSomeItems();
Hilang menggunakan pernyataan pada kedua tapi lebih mudah bagi saya untuk menangkap ketika menggunakanIDataReader
vsvar
.Apa yang ReSharper sarankan jelas terlalu sering menggunakan kata kunci var. Anda dapat menggunakannya di mana tipenya jelas:
Jika jenisnya tidak jelas, Anda sebaiknya menuliskannya:
sumber
var
adalah masalah pendapat, dan bukan "jelas" satu atau lain hal. Saya lebih suka untuk tidak mengetik hal-hal yang bisa diketahui oleh kompiler. Saya suka inferensi tipe C #, dan sering berharap itu sama baiknya dengan inferensi tipe F #. Jika saya bisa, saya akan meninggalkan tipe eksplisit dari parameter metode dan mengembalikan tipe, seperti norma dalam F #. Tidak semua orang setuju, tentu saja.Stream
objek misalnya dinamaiRead
, bukanReadAndReturnNumberOfBytesAsInt32
.Saya pribadi lebih suka mematikan saran ini. Menggunakan
var
sering dapat meningkatkan keterbacaan; tetapi seperti yang Anda sebutkan, kadang-kadang menguranginya (dengan jenis sederhana, atau ketika jenis yang dihasilkan tidak jelas ).Saya lebih suka memilih kapan saya menggunakan
var
dan ketika saya tidak. Tapi sekali lagi, itu hanya aku.sumber
var
cukup sering juga.var methodXYResultIntArray
. Itu bertentangan dengan semua standar pengkodean dan kurang ringkas dariint[] methodXYResult
. Jika Anda ingin mengembalikan abyte[]
dari metode di masa depan semua nama variabel Anda salah. Dengan tipe eksplisit, Anda dapat melakukan refactor dengan sangat mudah. Ada alasan untuk menggunakanvar
, fe dengan aDictionary<string, List<SomeType<int>>>
. Tetapi jika nama lengkap tipe tidak terlalu panjang dan Anda tidak menggunakannew
di sisi kanan (atau pemeran eksplisit) harus tidak menyarankan itu.var
dapat meningkatkan keterbacaan kode sekaligus mengurangi pemahaman kode secara langsung. Sama saja, dapat mengurangi keterbacaan kode untuk situasi lain. Terkadang penggunaannya netral. Ukuran keterbacaan terhadap pemahaman tidak proporsional tetapi tergantung pada situasinya. Terkadang keduanya meningkat atau menurun bersama.Faktornya adalah apa yang
var
sedang diterapkan dan seberapa baik target mendukung kebingungan langsung dari tipe datanya kepada pembaca, atau jika info jenisnya diperlukan untuk memahami bagian program yang ada.Misalnya, penamaan yang buruk dapat
var
menyebabkan penurunan pemahaman kode. Ini bukanvar
salah:Terkadang tidak masuk akal untuk menggunakan
var
tipe data sederhana ketika kode lebih mudah dibaca jika tidak ada:Terkadang
var
berguna untuk menyembunyikan informasi tipe data yang Anda tidak perlu melihat kerumitan:Anda harus menggunakan
var
ketika ada jenis anonim hadir karena tidak ada nama jenis untuk menyebutnya dengan:Ketika Anda memiliki Visual Studio Intellisense yang menyediakan informasi jenis terlepas dari itu
var
, Anda kemudian harus bergantung pada pemahaman Anda melalui pembacaan kode yang ketat tanpa bantuan. Mungkin bijaksana untuk menganggap tidak semua orang memiliki atau menggunakan Intellisense.Singkatnya berdasarkan pada contoh-contoh di atas, saya sarankan penerapan carte blanche
var
bukanlah ide yang baik karena kebanyakan hal paling baik dilakukan dalam jumlah sedang dan berdasarkan keadaan yang ada seperti ditunjukkan di sini.Mengapa Resharper menggunakannya secara default? Saya sarankan untuk kemudahan, karena tidak dapat mengurai nuansa situasi untuk memutuskan kapan sebaiknya tidak menggunakannya.
sumber
var
, itu akan memaksa Anda untuk menulis nama metode yang layak.GetNumber() -but what type?
- yah, kenapa kamu peduli? Jika itu penting untuk diketahui, panggil metode tersebutGetNumberAsDouble()
, maka jelas dan akan bekerja jika Anda memiliki satu metode kembalistring
dan satu lagidouble
.Di ReSharper (8.02, tetapi kemungkinan versi lain), opsi untuk saran "Gunakan deklarasi variabel lokal yang diketik secara implisit" dapat disesuaikan dengan preferensi Anda , apa pun itu, dengan terlebih dahulu membuka menu opsi untuk ReSharper:
Kemudian, di bawah "Inspeksi Kode" dengan menyesuaikan "Tingkat Permasalahan Inspeksi" dari bahasa pilihan Anda, dalam kasus saya c #:
Seperti yang Anda lihat, ada opsi untuk menyesuaikan semua saran yang dibuat ReSharper. Semoga ini bisa membantu orang seperti saya yang sudah memiliki strategi penggunaan 'var' dan hanya ingin ReSharper menghormatinya :)
sumber
Saya terkejut bahwa tidak ada yang menyebutkan bahwa juga lebih mudah untuk mengubah jenis objek yang dipakai, karena
adalah bentuk pengulangan . Jika saya ingin mengubah
AVeryLongTypeName
ke salah satu kelas turunannya, saya hanya perlu mengubah ini sekali ketika menggunakanvar
dan masih dapat mengakses metode kelas anak.Selain itu, peningkatan keterbacaan adalah poin penting, tetapi seperti yang orang lain katakan, var tidak boleh digunakan secara berlebihan, jadi saya pikir mematikan petunjuk di Resharper benar-benar baik-baik saja.
sumber
'var' adalah tentang menjadi jelas
Perdebatan utama tentang apakah menggunakan
var
kata kunci atau tidak adalah tentang seberapa mudah dibaca kode untuk Anda dan pengembang lainnya.Sama seperti jika Anda sedang menulis cerita, tidak ada jawaban benar yang pasti. Tapi mari kita lihat beberapa contohnya dalam bahasa Inggris.
Siapa yang pergi sebaliknya? Jake atau Bill? Dalam hal ini menggunakan nama "Jake" dan "Bill" seperti menggunakan nama tipe. Dan "Dia" dan "dia" seperti menggunakan
var
kata kunci. Dalam hal ini mungkin membantu untuk lebih spesifik. Contoh berikut ini jauh lebih jelas.Dalam hal ini menjadi lebih spesifik membuat kalimat menjadi lebih jelas. Tapi itu tidak selalu terjadi. Dalam beberapa kasus menjadi spesifik membuatnya lebih sulit untuk dibaca.
Dalam hal ini akan lebih mudah untuk membaca kalimat jika kita menggunakan "he" dan dalam beberapa kasus ditinggalkan namanya bersama-sama, yang setara dengan menggunakan
var
kata kunci.Contoh-contoh itu mencakup intinya, tetapi mereka tidak menceritakan keseluruhan cerita. Dalam contoh-contoh itu hanya ada satu cara untuk merujuk orang tersebut. Baik dengan menggunakan nama mereka atau dengan menggunakan istilah yang lebih umum seperti "dia" dan "dia".
Dalam hal kode, kami memiliki 3 cara untuk membantu menambah kejelasan. Jenis, nama variabel, dan penugasan. Ambil baris kode ini misalnya:
Pertanyaannya sekarang adalah apakah ada cukup informasi dalam baris kode itu untuk membantu Anda mengetahui apa yang terjadi?
Bagaimana dengan baris kode berikut? Apakah Anda masih tahu apa
p
artinya dalam hal ini:Bagaimana kalau sekarang:
Atau sekarang:
Atau yang ini:
Atau ini:
Apakah kata kunci
var
berfungsi dalam skenario yang diberikan tergantung banyak pada konteks kode, seperti bagaimana variabel, kelas, dan metode diberi nama. Ini juga tergantung pada kompleksitas kode dan sisa kode di sekitarnya.Secara pribadi saya suka menggunakan
var
kata kunci itu lebih komprehensif bagi saya sebagian besar waktu. Tapi saya juga cenderung memberi nama variabel saya setelah tipe jadi saya tidak benar-benar kehilangan informasi.Yang mengatakan kadang-kadang tergantung pada konteks saya membuat pengecualian, seperti sifat dari sesuatu yang kompleks, dan perangkat lunak tidak ada artinya jika tidak kompleks.
sumber
var
selama saya tahu apa itu ketika membaca satu baris itu. Jika saya tidak tahu apa metode dari Solusi lain menggunakan model domain yang berbeda kembali, saya lebih suka jenis yang didefinisikan secara eksplisit, membuatnya lebih mudah dibaca. +1Saya tidak menyukai ini juga.
Saya tidak ingin ini berubah menjadi perdebatan tentang penggunaan
var
, ini memiliki kegunaannya tetapi tidak boleh digunakan di mana-mana.Hal utama yang perlu diingat adalah ReSharper dikonfigurasi untuk standar pengkodean apa pun yang Anda inginkan.
Sunting: ReSharper dan var
sumber
Saya melihat banyak jawaban yang benar, tetapi melewatkan jawaban yang lengkap.
Memang benar bahwa ReSharper berlebihan
var
secara default. Saya pikir kebanyakan orang akan setuju dengan itu. Ini juga lebih mudah dibaca ketikavar
digunakan dan jenisnya jelas seperti ketika Anda menggunakannew
pernyataan. Saya melihat satu pos yang menunjukkan cara memperbarui keparahan inspeksi untuk hanya menunjukkan petunjuk untuk penggunaanvar
.Saya telah mencoba mengomentari posting lain terlebih dahulu untuk menambahkan tempat untuk mengatur ini tetapi tidak memiliki reputasi untuk itu. Rupanya, saya juga tidak memiliki reputasi untuk mengirim tangkapan layar pengaturan saya.
Saya akan menjelaskan cara menuju ke sana.
Di Visual Studio> Menu Utama> Resharper> Pilihan> Pengeditan Kode> C #> Gaya Kode> Penggunaan Var dalam deklarasi
Dokumentasi bantuan ReSharper: Gaya Sintaksis Kode: Pengetikan Implisit / Eksplisit (Kata Kunci 'var') - Konfigurasikan preferensi penggunaan kata kunci 'var'
sumber
Aturan saya adalah ini:
Apakah Anda mendeklarasikan tipe primitif (yaitu
byte
,char
,string
,int[]
,double?
,decimal
, dll)? -> Gunakan tipe:Apakah Anda mendeklarasikan tipe kompleks (yaitu
List<T>
,Dictionary<T, T>
,MyObj
)? -> Gunakanvar
:sumber
string myStr = "foo";
jelas itu string. Saya akan menempatkan semua contoh Anda dalam menggunakan kategori var ... dan deklarasi yang kembali dari metode untuk menggunakan tipe explicity. Tetapi pada akhirnya, apa pun yang Anda dan tim Anda rasakan lebih baik untuk proyek tertentu.Saya hanya ingin menunjukkan bahwa penggunaan "var" direkomendasikan dalam Konvensi C # Coding
jadi mungkin itulah sebabnya tip diaktifkan secara default di ReSharper. Mereka juga menyediakan beberapa kasus di mana itu tidak akan meningkatkan keterbacaan tepat di bawah dalam dokumen yang sama.
sumber
System.Diagnostics.PerformanceCounter()
- Anda dapat dengan mudah memberi tahu penghitung kinerja dari kelas diagnostik bawaan. Tetapi jenis apa yang dikembalikan ke sini?var thingyMaBob = GetThatSpecialThing(18,null,(MyEnum)2)
? Tidak ada petunjuk pencatatan jam kerja, terutama jika Anda memiliki lebih dari 100 proyek dalam solusi Anda.ReSharper merekomendasikan
var
karena cenderung mengacaukan pembuatan objek.Bandingkan dua contoh ini:
Itu hanya singkatan yang seharusnya lebih mudah dibaca.
Saya pikir tidak apa-apa ketika Anda membuat objek baru secara eksplisit dengan "baru". Namun dalam contoh Anda, mungkin tidak jelas jika kelas tidak diberi nama dengan benar.
sumber
BTW, ReSharper menggambarkan perbedaan antara 'Anda mungkin ingin menerapkan saran ini ke kode Anda' dan 'kode Anda rusak, ingin saya memperbaikinya?'. Kata
var
kunci dalam kategori saran, bersama dengan hal-hal seperti "membalikkan jika mengurangi bersarang"; Anda tidak harus mengikutinya.Anda dapat mengonfigurasikan betapa menjengkelkan setiap lansirannya melalui dialog Opsi, atau langsung melalui menu sembulan untuk lansiran itu. Anda dapat menurunkan versi hal-hal seperti
var
saran sehingga kurang menonjol, atau Anda dapat memutakhirkan hal-hal seperti peringatan 'gunakan metode perluasan' sehingga muncul sebagai kesalahan aktual.sumber
The
var
Fitur Bersih 3.0 hanya inferensi tipe , yaitu tipe aman dan sering membuat kode Anda lebih mudah dibaca. Tetapi Anda tidak harus, dan dapat menonaktifkan rekomendasi itu di resharper jika Anda mau.sumber
Var luar biasa! Saya telah menemukan banyak pengembang yang berada di bawah kesan yang
var
terikat pada tipe dinamis, bukan. Itu masih diketik secara statis, hanya diputuskan oleh kompiler.Berikut adalah beberapa hal positif dari penggunaan var
Kurang mengetik var lebih pendek dan lebih mudah dibaca, misalnya
Dictionary<int,IList<string>> postcodes = new Dictionary<int,IList<string>>()
Yuk.var postcodes = new Dictionary<int,IList<string>>()
\ o / \ o /Lebih banyak nama variabel deskriptif - yang lemah tapi saya pikir penting untuk membiarkan sifat cairan
var
bersinar di sini. Sepertivar
sedikit kabur, itu benar-benar mendorong nama variabel yang lebih deskriptif daripada membiarkan tipe berbicara sendiri.Kurangi perubahan kode - jika jenis pengembalian panggilan metode berubah. Anda hanya perlu mengubah pemanggilan metode, tidak setiap tempat digunakan.
Jenis anonim - jenis anonim adalah konsep yang sangat kuat, terutama di bidang-bidang seperti sumber daya parsial WebApi . Tanpa var, mereka tidak dapat digunakan.
Namun kadang-kadang berguna untuk secara eksplisit menyatakan jenis dan saya menemukan ini paling berguna dalam primitif atau struct. Sebagai contoh, saya pribadi tidak menemukan sintaks ini sangat berguna:
vs.
Semuanya tergantung pada preferensi pribadi tetapi menggunakan
var
benar - benar akan mempercepat pengembangan Anda dan membuka seluruh dunia jenis kebaikan anonim.sumber
Tidak ada perbedaan teknis, jika Anda menggunakan var, tipe tersirat oleh kompiler. Jika Anda memiliki kode seperti ini:
x disiratkan sebagai int dan tidak ada nilai lain yang dapat ditetapkan untuknya.
Kata kunci var berguna jika Anda mengubah jenis variabel; Anda hanya perlu melakukan satu perubahan alih-alih dua:
sumber
Kata
var
kunci diperkenalkan di C # 3.0 - ini memungkinkan kita untuk melupakan menentukan jenis kita secara eksplisit.Tidak ada perbedaan nyata untuk apakah Anda menggunakan atau tidak
MyObject foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
atau
var foo = DB.MyObjects.SingleOrDefault(w => w.Id == 1);
kecuali keterbacaan murni dan sedikit kemungkinan kesalahan.
Sepertinya ini contoh klise, tetapi katakan hal berikut ini dapat membantu pemahaman Anda:
mengembalikan
int
tipe, sedangkanmengembalikan
string
tipe.Referensi MSDN
sumber
Menentukan jenis objek eksplisit entah bagaimana berlebihan. Bahkan diterjemahkan dalam bahasa Inggris, itu terdengar berlebihan: "meletakkan objek tipe X dalam variabel tipe X" vs "Masukkan objek tipe X dalam variabel".
Namun, menggunakan 'var' memiliki keterbatasan . Ini mencegah penggunaan polimorfisme di bawah ini yang merupakan keindahan murni :
Anggaplah Anjing adalah Hewan; Cat memperluas hierarki kelas Hewan:
Kode yang sama, dengan x yang dideklarasikan dengan 'var' tidak akan dikompilasi .
Ngomong-ngomong, kembali ke pertanyaan awal, saya tidak menggunakan Resharper, tetapi saya menganggap itu cukup cerdas untuk mendeteksi kapan tidak menggunakan 'var'. :-)
sumber
as
) benar-benar mengerikan. Anda mengubah kesalahan kompilasi menjadi kesalahan runtime jika Anda memiliki sesuatu sepertiAnimal x = new Cat(); DoStuffWithDog(x as Dog);
Mengapa menggunakan kembali x? Anjing x = Anjing baru (), Kucing y = Kucing baru (), boom tidak ada lagi ambiguitas yang mungkin.Animal
ke dalam metode yang mengambilDog
danCat
. Polimorfisme adalah kebalikan: sehingga Anda dapat melewati objek tipeDog
danCat
menjadi metode yang mengambilAnimal
, misalnyavoid Walk(Animal a)
:Walk(new Cat())
,Walk(new Dog())
Menurut saya,
var
seharusnya hanya digunakan ketika itu segera jelas apa jenisnya ketika mendefinisikan nilai variabel.Contoh:
Jelas itu
s
adalah astring
.Saya percaya itu juga tepat ketika nama tipe variabel sangat kompleks.
Contoh:
Selain skenario ini, saya tidak melihat GAIN dibuat dengan menggunakan
var
, tapi saya bisa memikirkan beberapa skenario yang bisa merugikan:Misalnya, jenis sekali pakai yang nilai variabel sisi kanannya tidak jelas menunjukkan jenis itu. Membuang IDisposable dapat dengan mudah dilupakan
Contoh:
sumber
'var' menambahkan semacam elemen "dinamis" ke kode Anda (meskipun kode tetap diketik dengan ketat). Saya menyarankan agar tidak menggunakannya dalam kasus di mana tipenya tidak jelas. Pertimbangkan contoh ini:
Jika Tipe pengembalian GetTheObjectFromDatabase () diubah dari Tipe A ke B kami tidak akan melihat, karena kedua Kelas menerapkan DoSomething (). Namun, kode tersebut sekarang dapat benar-benar melakukan sesuatu yang sama sekali berbeda.
Ini mungkin sama halusnya seperti menulis hal-hal yang berbeda ke log, jadi Anda mungkin tidak menyadari bahwa unitl sudah terlambat.
Penggunaan var berikut harus selalu baik-baik saja:
sumber
Bagi mereka yang tidak menyukai penggunaan "var" secara konstan, Anda juga dapat menghentikan ReSharper dari default ke var ketika melakukan "memperkenalkan variabel". Ini adalah sesuatu yang membuat saya frustrasi untuk waktu yang lama, selalu default untuk var, dan saya mengubahnya setiap waktu.
Pengaturan ini berada di bawah Pengeditan Kode> C #> Gaya Kode
sumber
Tidak ada perbedaan teknis (seperti yang ditunjukkan eWolf). Anda dapat menggunakan satu atau yang lain, kode CLR yang dihasilkan akan terlihat sama.
Menurut pendapat saya manfaat utama adalah bahwa ini cenderung memaksa Anda untuk menggunakan penamaan variabel yang lebih baik. Dalam contoh Anda, 'foo' adalah pilihan yang sangat buruk untuk nama variabel.
sumber
Menurut JetBrains (penulis ReSharper), mereka mendorong penggunaan var secara default.
Dari situs web mereka :
sumber