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 kunci var 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