Mengapa ReSharper ingin menggunakan 'var' untuk semuanya?

214

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 varsebagai 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.

Chris
sumber
27
Saya telah memikirkan hal ini sebentar dan saya sampai pada kesimpulan bahwa saya harus selalu menggunakan 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;).
MasterMastic

Jawaban:

189

Salah satu alasannya adalah peningkatan keterbacaan. Mana yang lebih baik?

Dictionary<int, MyLongNamedObject> dictionary = new Dictionary<int, MyLongNamedObject>();

atau

var dictionary = new Dictionary<int, MyLongNamedObject>();
Mark Sherretta
sumber
260
Saya akan mengatakan yang pertama. Lebih mudah melihat apa yang terjadi!
Mongus Pong
104
Jamur: Anda suka Apakah Anda suka Redundant Text Redundant Text? : D
Mark Simpson
73
Menjadi eksplisit lebih jelas menurut saya. Menggunakan var ke banyak menciptakan sakit kepala di beberapa skenario.
user1231231412
172
Aku benci kalau pengembang menggunakan varuntuk segala sesuatu - saya lakukan banyak dan banyak ulasan kode menggunakan TFS (diffs berbasis web) dan itu membuat pekerjaan saya sangat sulit: yaitu var items = GetSomeItems();vs IDataReader dr = GetSomeItems();Hilang menggunakan pernyataan pada kedua tapi lebih mudah bagi saya untuk menangkap ketika menggunakan IDataReadervs var.
Chris Gessler
17
jika Anda seorang pengembang yang baik menulis kode yang baik, dan Anda menggunakan perpustakaan seperti Resharper, maka Anda tidak perlu tahu tipe eksplisit yang berurusan dengan Anda. Sama seperti ketika Anda menggunakan antarmuka untuk mendeklarasikan kontrak, tetapi bukan kelas konkret, var memungkinkan Anda mengatakan bahwa Anda tidak peduli apa "tipe" pengembaliannya, Anda hanya peduli apa yang dilakukannya, dan menggunakan variabel yang dinamai, bersama dengan intelli-sense & resharper / VS helpers (seperti CTRL + KLIK untuk menavigasi ke definisi) akan membuat Anda 99% dari perjalanan ke sana. Selain itu, menggunakan var berarti saya tidak perlu menulis ulang basis kode saya jika saya mengubah jenis metode pengembalian.
Joshua Barker
286

Apa yang ReSharper sarankan jelas terlalu sering menggunakan kata kunci var. Anda dapat menggunakannya di mana tipenya jelas:

var obj = new SomeObject();

Jika jenisnya tidak jelas, Anda sebaiknya menuliskannya:

SomeObject obj = DB.SomeClass.GetObject(42);
Guffa
sumber
36
Untuk bermain advokat setan, mungkin jika jenisnya tidak jelas dari metode atau nama variabel, itu menunjukkan masalah dengan penamaan lebih dari terlalu sering menggunakan var. Saya setuju pada prinsipnya, var seharusnya hanya digunakan ketika tidak menghilangkan kejelasan.
Matt Briggs
33
Dalam contoh ini saya lebih suka menggunakan nama variabel yang lebih baik. Anda pada dasarnya mengusulkan agar kita melihat ke atas untuk melihat di mana variabel didefinisikan untuk mengetahui tipe - Saya mengusulkan agar kita memberi nama variabel lebih baik sehingga kita tahu tujuan dari variabel begitu saja.
Jaco Pretorius
18
@Jaco: +1, tetapi perlu disebutkan bahwa informasi tentang tipe tidak disarankan untuk menggunakan nama variabel. Misalnya, notasi Hongaria tidak dianggap sebagai praktik yang baik.
Roman Boiko
8
Apakah pengaturan default ReSharper terlalu sering digunakan varadalah 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.
Joel Mueller
15
@AnonymousType: Anda masih melewatkan intinya. Anda mengatakan bahwa nama metode harus selalu mencerminkan maksud dari metode tersebut, tetapi meskipun mereka melakukannya, itu tidak berarti bahwa nama tersebut menentukan jenis nilai pengembalian. Metode untuk membaca dari Streamobjek misalnya dinamai Read, bukan ReadAndReturnNumberOfBytesAsInt32.
Guffa
99

Saya pribadi lebih suka mematikan saran ini. Menggunakan varsering 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 vardan ketika saya tidak. Tapi sekali lagi, itu hanya aku.

Bryan Menard
sumber
11
Saya pikir ReSharper seharusnya cukup pintar; Bukankah seharusnya cukup pintar untuk mengetahui kapan jenis yang dihasilkan jelas (mis. Apa pun dengan kata kunci baru) dan kapan tidak jelas?
DisgruntledGoat
3
Yah, saya tidak tahu keanehan fitur ini tetapi, saya yakin tahu saya kewalahan dengan jumlah saran yang diberikannya; Dan saya menggunakan varcukup sering juga.
Bryan Menard,
5
Saya menemukan bahwa ketika Anda selalu menggunakan var (seperti menyarankan pemanfaat), itu memaksa Anda untuk memberi nama variabel Anda dengan benar.
Sauleil
Bisakah Anda mematikan saran itu?
Chris S
@AngeDeLaMort: intinya adalah itu memaksa Anda untuk menggunakan nama yang tidak patut, fe var methodXYResultIntArray. Itu bertentangan dengan semua standar pengkodean dan kurang ringkas dari int[] methodXYResult. Jika Anda ingin mengembalikan a byte[]dari metode di masa depan semua nama variabel Anda salah. Dengan tipe eksplisit, Anda dapat melakukan refactor dengan sangat mudah. Ada alasan untuk menggunakan var, fe dengan a Dictionary<string, List<SomeType<int>>>. Tetapi jika nama lengkap tipe tidak terlalu panjang dan Anda tidak menggunakan newdi sisi kanan (atau pemeran eksplisit) harus tidak menyarankan itu.
Tim Schmelter
69

vardapat 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 varsedang 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 varmenyebabkan penurunan pemahaman kode. Ini bukan varsalah:

var value1 = GetNotObviousValue(); //What's the data type? 
//vs. 
var value2 = Math.Abs(-3); // Obviously a numeric data type. 

Terkadang tidak masuk akal untuk menggunakan vartipe data sederhana ketika kode lebih mudah dibaca jika tidak ada:

var num = GetNumber(); // But what type of number?
// vs. 
double num = GetNumber(); // I see, it's a double type. 

Terkadang varberguna untuk menyembunyikan informasi tipe data yang Anda tidak perlu melihat kerumitan:

    IEnumerable<KeyValuePair<string,List<Dictionary<int,bool>>>> q = from t in d where t.Key == null select t; // OMG! 
    //vs. 
    var q = from t in d where t.Key == null select t;

    // I simply want the first string, so the last version seems fine.  
    q.First().Key; 

Anda harus menggunakan varketika ada jenis anonim hadir karena tidak ada nama jenis untuk menyebutnya dengan:

var o = new { Num=3, Name="" };

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 varbukanlah 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.

John K.
sumber
5
IMHO contoh Anda sebenarnya alasan yang baik untuk digunakan 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 tersebut GetNumberAsDouble(), maka jelas dan akan bekerja jika Anda memiliki satu metode kembali stringdan satu lagi double.
nicodemus13
10
@ nicodemus13 Biasanya Anda tahu kapan Anda peduli tentang jenis pengembalian suatu fungsi ketika Anda benar-benar menggunakan nilai kembali daripada ketika Anda menulis fungsi itu sendiri. Skema penamaan yang Anda sarankan dapat mengarah pada penyalahgunaan seperti GetResultsAsIEnumerableOfDouble dan yang dilakukannya hanyalah menggeser informasi jenis yang Anda hapus dari sisi kiri penugasan dengan menggunakan var ke sisi kanan penugasan.
Eric
var value2 = Math.Abs ​​(-3); // Jelas tipe data numerik. Maaf saya tidak setuju dengan yang satu ini, sepenuhnya, mengingat bahwa metode Abs memiliki 7 kelebihan yang mengarah pada ketidakjelasan ketika melihatnya, imo
s1cart3r
var juga dapat menyebabkan kesalahan logika halus seperti: var counter = "0"; ketika apa yang Anda inginkan adalah bilangan bulat.
alaniane
42

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:

Menu Opsi ReSharper

Kemudian, di bawah "Inspeksi Kode" dengan menyesuaikan "Tingkat Permasalahan Inspeksi" dari bahasa pilihan Anda, dalam kasus saya c #:

Matikan saran variabel lokal yang diketik secara implisit

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 :)

Paling mengejutkan
sumber
Ini menjawab pertanyaan berbeda yang tidak ditanyakan sama sekali.
Carles Alcolea
9
Tapi itu relevan bagi banyak orang yang mencarinya ketika tiba di sini. +1
Ori Nachum
24

Saya terkejut bahwa tidak ada yang menyebutkan bahwa juga lebih mudah untuk mengubah jenis objek yang dipakai, karena

AVeryLongTypeName myVariable = new AVeryLongTypeName( arguments );

adalah bentuk pengulangan . Jika saya ingin mengubah AVeryLongTypeNameke salah satu kelas turunannya, saya hanya perlu mengubah ini sekali ketika menggunakan vardan 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.

Philipp
sumber
Sangat berguna saat memanggil metode pabrik ketimbang "baru"
Ian Ringrose
Jika Anda perlu menggunakan 'MyClass' ketika Anda awalnya menulis kode dan itu berfungsi, maka itu berfungsi. Ketika Anda perlu mengubahnya, Anda harus pergi dan mengubahnya di mana-mana, terutama ketika Anda memiliki antarmuka yang terlibat. Kode seharusnya tidak diperlakukan seperti esai, harus semantik dan didefinisikan dengan baik.
Piotr Kula
24

'var' adalah tentang menjadi jelas

Perdebatan utama tentang apakah menggunakan varkata 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.

Jake menyapa Bill. Dia tidak menyukainya, jadi dia berbalik dan pergi ke arah lain.

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 varkata kunci. Dalam hal ini mungkin membantu untuk lebih spesifik. Contoh berikut ini jauh lebih jelas.

Jake menyapa Bill. Jake tidak menyukai Bill, jadi ia berbalik dan pergi ke arah lain.

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.

Bill suka buku, jadi Bill pergi ke perpustakaan dan Bill mengeluarkan buku yang selalu disukai Bill.

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 varkata kunci.

Bill suka buku, jadi dia pergi ke perpustakaan dan mengeluarkan buku yang selalu dia sukai.

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:

Person p = GetPerson();

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 partinya dalam hal ini:

var p = GetPerson();

Bagaimana kalau sekarang:

var p = Get();

Atau sekarang:

var person = Get();

Atau yang ini:

var t = GetPerson();

Atau ini:

var u = Person.Get();

Apakah kata kunci varberfungsi 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 varkata 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.

Luis Perez
sumber
1
Saya suka jawaban ini yang terbaik, karena saya tidak menentang apa pun varselama 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. +1
Piotr Kula
Dalam semua kasus Anda di mana jenis yang dikembalikan tidak jelas, saya setuju Anda tidak boleh menggunakan var karena Anda sekarang menghilangkan informasi yang berguna.
menggulung
18

Saya 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

LiamB
sumber
13
Setelah satu tahun menolak, saya selalu menggunakan var sekarang.
LiamB
15

Saya melihat banyak jawaban yang benar, tetapi melewatkan jawaban yang lengkap.

Memang benar bahwa ReSharper berlebihan varsecara default. Saya pikir kebanyakan orang akan setuju dengan itu. Ini juga lebih mudah dibaca ketika vardigunakan dan jenisnya jelas seperti ketika Anda menggunakan newpernyataan. Saya melihat satu pos yang menunjukkan cara memperbarui keparahan inspeksi untuk hanya menunjukkan petunjuk untuk penggunaan var.

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

  • Untuk tipe bawaan Gunakan tipe eksplisit
  • Untuk tipe sederhana Gunakan 'var' saat terbukti
  • Di Tempat Lain, Gunakan'var '

masukkan deskripsi gambar di sini

Dokumentasi bantuan ReSharper: Gaya Sintaksis Kode: Pengetikan Implisit / Eksplisit (Kata Kunci 'var') - Konfigurasikan preferensi penggunaan kata kunci 'var'

Nathan Kovac
sumber
Ini harus ditandai sebagai jawaban yang benar di luar perdebatan var, ini adalah pendekatan yang seimbang
Brian Ogden
Bisakah Anda memberi contoh tentang bagaimana "di mana bukti" diputuskan?
bergulung
13

Aturan saya adalah ini:

  • Apakah Anda mendeklarasikan tipe primitif (yaitu byte, char, string, int[], double?, decimal, dll)? -> Gunakan tipe:

    string myStr = "foo";
    int[] myIntArray = [123, 456, 789];
    double? myDouble = 123.3;
  • Apakah Anda mendeklarasikan tipe kompleks (yaitu List<T>, Dictionary<T, T>, MyObj)? -> Gunakan var:

    var myList = List<string>();
    var myDictionary = Dictionary<string, string>();
    var myObjInstance = new MyObj();
Sumner Evans
sumber
Saya ingin tidak setuju, 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.
Dean Meehan
12

Saya hanya ingin menunjukkan bahwa penggunaan "var" direkomendasikan dalam Konvensi C # Coding

ketika jenis variabel jelas dari sisi kanan penugasan, atau ketika jenis tepatnya tidak penting

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.

jose
sumber
Itu bagus ketika Anda tahu bahwa tipe itu berasal 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.
Piotr Kula
"Disarankan ketika jenis variabelnya jelas", dan "Mereka juga menyediakan beberapa kasus di mana itu tidak akan meningkatkan keterbacaan tepat di bawah dalam dokumen yang sama". Sejujurnya, saya pikir saya telah melewatkan poin Anda. Jawaban saya mengatakan hal yang sama dengan yang Anda katakan.
jose
6

ReSharper merekomendasikan varkarena cenderung mengacaukan pembuatan objek.

Bandingkan dua contoh ini:

StringBuilder bld = new StringBuilder();

var bld = new StringBuilder();

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.

Paul Sasik
sumber
6

BTW, ReSharper menggambarkan perbedaan antara 'Anda mungkin ingin menerapkan saran ini ke kode Anda' dan 'kode Anda rusak, ingin saya memperbaikinya?'. Kata varkunci 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 varsaran sehingga kurang menonjol, atau Anda dapat memutakhirkan hal-hal seperti peringatan 'gunakan metode perluasan' sehingga muncul sebagai kesalahan aktual.

Tim Robinson
sumber
5

The varFitur 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.

Klaus Byskov Pedersen
sumber
4

Var luar biasa! Saya telah menemukan banyak pengembang yang berada di bawah kesan yang varterikat 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 varbersinar di sini. Seperti varsedikit 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:

for(var i = 0; i < 10; i++) 
{

}

vs.

for(int i = 0; i < 10; i++) 
{

}

Semuanya tergantung pada preferensi pribadi tetapi menggunakan varbenar - benar akan mempercepat pengembangan Anda dan membuka seluruh dunia jenis kebaikan anonim.

KnowHoper
sumber
2

Tidak ada perbedaan teknis, jika Anda menggunakan var, tipe tersirat oleh kompiler. Jika Anda memiliki kode seperti ini:

var x = 1;

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:

var x = 1; --> var x = "hello";
int x = 1; --> string x = "hello";
eWolf
sumber
1
@AlexKamburov kode 10 baris di bawah ini akan tetap rusak, tidak terkait dengan var.
user3285954
1
@ user3285954 Dalam beberapa kasus var dapat menyembunyikan masalah dan saat itulah segala sesuatunya menjadi jelek. Masalahnya bukan dalam menulis kode, masalahnya adalah dalam perawatan. Beberapa orang berpendapat itu lebih bersih dengan var tapi saya kadang-kadang melihatnya sebagai kebingungan. Ini dekat dengan perdebatan agama. brad-smith.info/blog/archives/336 Saya pribadi menggunakan var hanya untuk pernyataan Linq dan tempat-tempat lain di mana menyatakan jenisnya benar-benar bertele-tele. Saya pikir var adalah tambahan yang baik dan orang-orang perlu menonton komentar Anders Hejlsberg tentang alasan untuk memperkenalkannya.
Alex Kamburov
2

Kata varkunci 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:

var myInt = 23;

mengembalikan inttipe, sedangkan

var myInt = "23";

mengembalikan stringtipe.

Referensi MSDN

Daniel May
sumber
2

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:

Animal x = new Dog();
DoStuffWithDog(x as Dog);

x = new Cat();
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

Kode yang sama, dengan x yang dideklarasikan dengan 'var' tidak akan dikompilasi .

var x = new Dog(); // from this point, x is a Dog
DoStuffWithDog(x as Dog);

x = new Cat(); // cannot assign a Cat instance to a Dog
DoStuffWithCat(x as Cat);

void DoStuffWithDog(Dog d){}
void DoStuffWithCat(Cat c){}

Ngomong-ngomong, kembali ke pertanyaan awal, saya tidak menggunakan Resharper, tetapi saya menganggap itu cukup cerdas untuk mendeteksi kapan tidak menggunakan 'var'. :-)

xtrem
sumber
4
Pengecoran yang tidak perlu (dengan as) benar-benar mengerikan. Anda mengubah kesalahan kompilasi menjadi kesalahan runtime jika Anda memiliki sesuatu seperti Animal 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.
Mark Sowul
casting (dengan 'sebagai' atau tidak) dapat mengakibatkan kesalahan waktu berjalan. Apa yang 'mengerikan' tentang casting ketika Anda tahu apa yang Anda lakukan? Mengapa menggunakan kembali x? Contoh di sini adalah ilustrasi. Tujuan dari contoh ini adalah untuk menunjukkan bagaimana menggunakan 'var' dapat menghasilkan keterbatasan ketika referensi dimaksudkan menjadi polimorfik.
xtrem
5
Tidak, tidak bisa: polimorfisme adalah kebalikan dari apa yang terjadi di sini. Ini mencoba untuk melewatkan objek bertipe Animalke dalam metode yang mengambil Dogdan Cat. Polimorfisme adalah kebalikan: sehingga Anda dapat melewati objek tipe Dogdan Catmenjadi metode yang mengambil Animal, misalnya void Walk(Animal a): Walk(new Cat()),Walk(new Dog())
Mark Sowul
Anda seharusnya tidak menggunakan kembali variabel dengan cara ini, menyebabkan bug yang sangat jahat. Tidak begitu jelas dalam metode pendek tetapi ketika Anda memiliki 15-20 baris kode Anda akan lupa apa itu x. Jangan malas: var dog = new Dog (); DoStuff (anjing); var cat = Cat baru (); DoStuff (kucing);
user3285954
2
Tidak bertengkar. Saya tidak punya perasaan untuk kedua cara mendeklarasikan variabel (implisit atau eksplisit). Saya benar-benar menggunakan setidaknya satu setiap hari. Saya hanya menyoroti bahwa ketika Anda memilih metode implisit (var), kompiler akan memutuskan jenis tersempit yang mungkin untuk Anda. Yang mungkin tidak selalu seperti yang Anda inginkan. Itu saja.
xtrem
2

Menurut saya, var seharusnya hanya digunakan ketika itu segera jelas apa jenisnya ketika mendefinisikan nilai variabel.

Contoh:

var s = "string value";

Jelas itu sadalah a string.

Saya percaya itu juga tepat ketika nama tipe variabel sangat kompleks.

Contoh:

Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>> dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

// This is a little easier to read than the above statement
var dict = new Dictionary<SomeCustomKeyType, Dictionary<AnotherCustomKeyType, List<int>>>();

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:

// returns some file writer
var wr = GetWriter();

wr.add("stuff");
wr.add("more stuff");

//...
//...

// Now `wr` needs to be disposed, 
// but there is no clear indication of the type of `wr`,
// so it will be easily overlooked by code writer and code reviewer.
James Wierzba
sumber
1

'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:

var bar = GetTheObjectFromDatabase();
bar.DoSomething();

ClassA {
  void DoSomething() {
  //does something
  }
}

ClassB {
  void DoSomething() {
  //does something entirely different
  }
}

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:

var abc = new Something();
lolaldanee
sumber
1

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

masukkan deskripsi gambar di sini

Derek
sumber
0

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.

Jaco Pretorius
sumber
0

Menurut JetBrains (penulis ReSharper), mereka mendorong penggunaan var secara default.

Dari situs web mereka :

Menggunakan variabel lokal yang diketik secara implisit (juga dikenal sebagai varkata kunci) yang diperkenalkan dalam C # 3.0 telah menjadi cukup populer karena meningkatkan keterbacaan dalam banyak skenario. Secara default, ReSharper juga menganjurkan penggunaan varkata kunci, tetapi preferensi penggunaannya dapat dikonfigurasi secara fleksibel - misalnya, Anda dapat memilih untuk menggunakan jenis eksplisit dalam kasus tertentu atau di mana saja dan ReSharper akan membantu Anda menegakkan preferensi Anda.

Jeff Reddy
sumber
Di mana saya bisa mengonfigurasi kapan akan membutuhkan deklarasi tipe eksplisit?
user764754