Di C #, bagaimana cara varkerja kata kunci ?
Di C #, bagaimana cara varkerja kata kunci ?
Jawaban:
Ini berarti bahwa tipe lokal yang dideklarasikan akan disimpulkan oleh kompilator berdasarkan tugas pertamanya:
// This statement:
var foo = "bar";
// Is equivalent to this statement:
string foo = "bar";
Khususnya, vartidak mendefinisikan variabel menjadi tipe dinamis. Jadi ini TIDAK legal:
var foo = "bar";
foo = 1; // Compiler error, the foo variable holds strings, not ints
var hanya memiliki dua kegunaan:
var foo = new { Bar = "bar" };Anda tidak dapat menggunakan varsebagai jenis apa pun kecuali penduduk setempat. Jadi, Anda tidak dapat menggunakan kata kunci varuntuk mendeklarasikan jenis bidang / properti / parameter / pengembalian.
var foo = new Foo();adalah hal yang sama seperti Foo foo = new Foo();yang berarti bahwa foodapat berisi Fooreferensi, atau referensi ke objek apapun Foo sub jenis, bukan suatu Foo yang super jenis.
Artinya tipe data diturunkan (tersirat) dari konteks.
Dari http://msdn.microsoft.com/en-us/library/bb383973.aspx
Mulai dalam Visual C # 3.0, variabel yang dideklarasikan pada lingkup metode dapat memiliki tipe var implisit. Variabel lokal yang diketik secara implisit diketik dengan kuat seperti jika Anda telah mendeklarasikan tipenya sendiri, tetapi kompilator menentukan tipenya. Dua deklarasi i berikut secara fungsional setara:
var i = 10; // implicitly typed
int i = 10; //explicitly typed
var berguna untuk menghilangkan pengetikan keyboard dan gangguan visual, misalnya,
MyReallyReallyLongClassName x = new MyReallyReallyLongClassName();
menjadi
var x = new MyReallyReallyLongClassName();
tetapi dapat digunakan secara berlebihan sampai pada titik di mana keterbacaan dikorbankan.
Ini mendeklarasikan tipe berdasarkan apa yang ditugaskan padanya dalam inisialisasi.
Contoh sederhananya adalah kode:
var i = 53;
Akan memeriksa tipe 53, dan pada dasarnya menulis ulang ini sebagai:
int i = 53;
Perhatikan bahwa sementara kita dapat memiliki:
long i = 53;
Ini tidak akan terjadi dengan var. Padahal bisa dengan:
var i = 53l; // i is now a long
Demikian pula:
var i = null; // not allowed as type can't be inferred.
var j = (string) null; // allowed as the expression (string) null has both type and value.
Ini bisa menjadi kenyamanan kecil dengan tipe yang rumit. Ini lebih penting dengan tipe anonim:
var i = from x in SomeSource where x.Name.Length > 3 select new {x.ID, x.Name};
foreach(var j in i)
Console.WriteLine(j.ID.ToString() + ":" + j.Name);
Di sini tidak ada cara lain untuk mendefinisikan idan jselain menggunakan varkarena tidak ada nama untuk tipe yang mereka pegang.
Apakah Anda pernah benci menulis penginisialisasi variabel seperti itu?
XmlSerializer xmlSerializer = new XmlSerialzer(typeof(int))
Jadi, dimulai dengan C # 3.0, Anda bisa menggantinya dengan
var xmlSerializer = new XmlSerialzer(typeof(int))
Satu pemberitahuan: Jenis diselesaikan selama kompilasi, jadi tidak ada masalah dengan kinerja. Tetapi Compiler harus dapat mendeteksi tipe selama langkah build, jadi kode like var xmlSerializer;tidak dapat dikompilasi sama sekali.
int i = 100;// explicitly typed
var j = 100; // implicitly typed
var adalah "kata kunci kontekstual" dalam C # yang berarti Anda hanya dapat menggunakannya sebagai variabel lokal secara implisit dalam konteks kelas yang sama yang Anda gunakan sebagai variabel. Jika Anda mencoba menggunakannya di kelas yang Anda panggil dari "Utama" atau kelas eksterior lainnya, atau antarmuka misalnya, Anda akan mendapatkan kesalahan CS0825 < https://docs.microsoft.com/en-us/dotnet/ csharp / misc / cs0825 >
Lihat komentar tentang kapan Anda dapat dan tidak dapat menggunakannya dalam dokumentasi di sini: < https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/implicitly-typed -variabel-lokal # komentar >
Pada dasarnya, Anda hanya boleh menggunakan ini ketika Anda mendeklarasikan variabel dengan nilai implisit seperti "var myValue =" This is the value "; Ini menghemat sedikit waktu dibandingkan dengan mengatakan" string "misalnya, tetapi IMHO tidak banyak waktu disimpan dan membatasi skalabilitas proyek Anda.
var foo = new Foo(),foobisa dari jenisFooatau kelas super. Bagaimana itu bisa legal?