Variabel lokal yang diketik secara implisit (Panduan Pemrograman C#)
Variabel lokal dapat dideklarasikan tanpa memberikan jenis eksplisit. Kata kunci var
menginstruksikan kompilator untuk menyimpulkan jenis variabel dari ekspresi di sisi kanan pernyataan inisialisasi. Jenis yang disimpulkan mungkin jenis bawaan, jenis anonim, jenis yang ditentukan pengguna, atau jenis yang ditentukan di pustaka kelas .NET. Untuk informasi selengkapnya tentang cara menginisialisasi larik dengan var
, lihat Larik yang Diketik Secara Implisit.
Contoh berikut menunjukkan berbagai cara di mana variabel lokal dapat dideklarasikan dengan var
:
// i is compiled as an int
var i = 5;
// s is compiled as a string
var s = "Hello";
// a is compiled as int[]
var a = new[] { 0, 1, 2 };
// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
from c in customers
where c.City == "London"
select c;
// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };
// list is compiled as List<int>
var list = new List<int>();
Penting untuk dipahami bahwa kata kunci var
tidak berarti "varian" dan tidak menunjukkan bahwa variabel diketik dengan longgar, atau terikat dengan terlambat. Hal ini hanya berarti bahwa kompilator menentukan dan menetapkan jenis yang paling tepat.
Kata kunci var
dapat digunakan dalam konteks berikut:
Pada variabel lokal (variabel yang dideklarasikan pada cakupan metode) seperti yang ditunjukkan pada contoh sebelumnya.
Dalam pernyataan inisialisasi for.
for (var x = 1; x < 10; x++)
Dalam pernyataan inisialisasi foreach.
foreach (var item in list) {...}
Dalam pernyataan using.
using (var file = new StreamReader("C:\\myfile.txt")) {...}
Untuk informasi selengkapnya, lihat Cara menggunakan variabel dan larik lokal yang diketik secara implisit dalam ekspresi kueri.
jenis var dan anonim
Dalam banyak kasus, penggunaan var
bersifat opsional dan hanya untuk kenyamanan sintaksis. Tetapi, ketika variabel diinisialisasi dengan jenis anonim, Anda harus mendeklarasikan variabel sebagai var
jika Anda perlu mengakses properti objek di lain waktu. Ini adalah skenario umum dalam ekspresi kueri LINQ. Untuk informasi selengkapnya, lihat Jenis Anonim.
Dari perspektif kode sumber Anda, jenis anonim tidak memiliki nama. Oleh karena itu, jika variabel kueri telah diinisialisasi dengan var
, maka satu-satunya cara untuk mengakses properti dalam urutan objek yang dikembalikan adalah dengan menggunakan var
sebagai jenis variabel perulangan dalam pernyataan foreach
.
class ImplicitlyTypedLocals2
{
static void Main()
{
string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };
// If a query produces a sequence of anonymous types,
// then use var in the foreach statement to access the properties.
var upperLowerWords =
from w in words
select new { Upper = w.ToUpper(), Lower = w.ToLower() };
// Execute the query
foreach (var ul in upperLowerWords)
{
Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
}
}
}
/* Outputs:
Uppercase: APPLE, Lowercase: apple
Uppercase: BLUEBERRY, Lowercase: blueberry
Uppercase: CHERRY, Lowercase: cherry
*/
Keterangan
Pembatasan berikut berlaku untuk deklarasi variabel yang diketik secara implisit:
var
hanya dapat digunakan ketika variabel lokal dideklarasikan dan diinisialisasi dalam pernyataan yang sama; variabel tidak dapat diinisialisasi ke null, atau ke grup metode atau fungsi anonim.var
tidak dapat digunakan pada bidang pada cakupan kelas.Variabel yang dideklarasikan dengan menggunakan
var
tidak dapat digunakan dalam ekspresi inisialisasi. Dengan kata lain, ekspresi ini legal:int i = (i = 20);
tetapi ekspresi 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
ada dalam cakupan, maka kata kuncivar
akan ditetapkan ke nama jenis tersebut dan tidak akan diperlakukan sebagai bagian dari deklarasi variabel lokal yang diketik secara implisit.
Pengetikan implisit dengan kata kunci var
hanya dapat diterapkan ke variabel pada cakupan metode lokal. Pengetikan implisit tidak tersedia untuk bidang kelas karena kompilator C# akan mengalami paradoks logis saat memproses kode: kompilator perlu mengetahui jenis bidang, tetapi tidak dapat menentukan jenis hingga ekspresi penugasan dianalisis, dan ekspresi tidak dapat dievaluasi tanpa mengetahui jenisnya. Pertimbangkan gambar berikut:
private var bookTitles;
bookTitles
adalah bidang kelas yang diberi jenis var
. Karena bidang tidak memiliki ekspresi untuk dievaluasi, kompilator tidak mungkin menyimpulkan jenis bookTitles
. Selain itu, menambahkan ekspresi ke bidang (seperti yang Anda lakukan untuk variabel lokal) juga tidak cukup:
private var bookTitles = new List<string>();
Ketika kompilator menemukan bidang selama kompilasi kode, kompilator mencatat jenis setiap bidang sebelum memproses ekspresi apa pun yang terkait dengan bidang. Kompilator menemukan paradoks yang sama saat mencoba mengurai bookTitles
: kompilator perlu mengetahui jenis bidang, tetapi kompilator biasanya akan menentukan jenis var
dengan menganalisis ekspresi, yang tidak mungkin dilakukan tanpa mengetahui jenisnya terlebih dahulu.
Anda mungkin menemukan bahwa var
juga dapat berguna dengan ekspresi kueri di mana jenis yang dibangun dengan tepat dari variabel kueri sulit untuk ditentukan. Hal ini dapat terjadi dengan operasi pengelompokan dan pengurutan.
Kata kunci var
juga dapat berguna ketika jenis variabel tertentu membosankan untuk diketik di keyboard, atau jelas, atau tidak menambah keterbacaan kode. Salah satu contoh di mana var
berguna dengan cara ini adalah dengan jenis generik berlapis seperti yang digunakan dengan operasi grup. Dalam kueri berikut, jenis variabel kueri adalah IEnumerable<IGrouping<string, Student>>
. Selama Anda dan orang lain yang harus memelihara kode Anda memahami hal ini, tidak ada masalah dengan menggunakan pengetikan implisit untuk kenyamanan dan keringkasan.
// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable<IGrouping<string, Student>>
var studentQuery3 =
from student in students
group student by student.Last;
Penggunaan var
membantu menyederhanakan kode Anda, tetapi penggunaannya harus dibatasi pada kasus-kasus saat diperlukan, atau saat penggunaannya membuat kode Anda lebih mudah dibaca. Untuk informasi selengkapnya tentang kapan harus menggunakan var
dengan benar, lihat bagian Variabel lokal yang diketik secara implisit pada artikel Panduan Pengodean C#.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk