Örtük olarak yazılan yerel değişkenler (C# Programlama Kılavuzu)

Yerel değişkenler açık bir tür verilmeden bildirilebilir. var anahtar sözcüğü, derleyiciye başlatma deyiminin sağ tarafındaki ifadeden değişkenin türünü çıkarmasını bildirir. Çıkarılan tür yerleşik bir tür, anonim bir tür, kullanıcı tanımlı bir tür veya .NET sınıf kitaplığında tanımlanan bir tür olabilir. ile vardizileri başlatma hakkında daha fazla bilgi için bkz . Örtük Olarak Yazılan Diziler.

Aşağıdaki örneklerde yerel değişkenlerin ile varbildirilebileceği çeşitli yollar gösterilmektedir:

// 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>();

Anahtar sözcüğün var "değişken" anlamına gelmediğini ve değişkenin gevşek bir şekilde yazıldığını veya geç bağlandığını belirtmediğini anlamak önemlidir. Yalnızca derleyicinin en uygun türü belirlediğini ve atadığını gösterir.

anahtar var sözcüğü aşağıdaki bağlamlarda kullanılabilir:

  • Önceki örnekte gösterildiği gibi yerel değişkenler üzerinde (yöntem kapsamında bildirilen değişkenler).

  • for initialization deyiminde.

    for (var x = 1; x < 10; x++)
    
  • Foreach başlatma deyiminde.

    foreach (var item in list) {...}
    
  • using deyiminde.

    using (var file = new StreamReader("C:\\myfile.txt")) {...}
    

Daha fazla bilgi için bkz . Örtük olarak yazılan yerel değişkenleri ve dizileri sorgu ifadesinde kullanma.

var ve anonim türler

Çoğu durumda kullanımı var isteğe bağlıdır ve yalnızca bozulmaya neden olan bir kolaylıktır. Ancak, bir değişken anonim bir türle başlatıldığında, değişkeni daha sonraki bir noktada nesnenin özelliklerine erişmeniz gerektiği gibi var bildirmeniz gerekir. Bu, LINQ sorgu ifadelerinde yaygın bir senaryodur. Daha fazla bilgi için bkz . Anonim Türler.

Kaynak kodunuzun perspektifinden bakıldığında anonim bir türün adı yoktur. Bu nedenle, bir sorgu değişkeni ile varbaşlatıldıysa, döndürülen nesne dizisindeki özelliklere erişmenin tek yolu deyimindeki foreach yineleme değişkeninin türü olarak kullanmaktırvar.

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
 */

Açıklamalar

Örtük olarak yazılan değişken bildirimleri için aşağıdaki kısıtlamalar geçerlidir:

  • var yalnızca aynı deyimde bir yerel değişken bildirildiğinde ve başlatıldığında kullanılabilir; değişkeni null veya bir yöntem grubuna veya anonim bir işleve başlatılamaz.

  • var sınıf kapsamındaki alanlarda kullanılamaz.

  • kullanılarak var bildirilen değişkenler başlatma ifadesinde kullanılamaz. Başka bir deyişle, bu ifade yasaldır: int i = (i = 20); ancak bu ifade derleme zamanı hatası oluşturur: var i = (i = 20);

  • Örtük olarak türü belirlenmiş birden çok değişken aynı deyimde başlatılamaz.

  • Adlı var bir tür kapsam içindeyse, var anahtar sözcük bu tür adına çözümlenir ve örtük olarak yazılan yerel değişken bildiriminin parçası olarak değerlendirilmez.

anahtar sözcüğüyle var örtük yazma yalnızca yerel yöntem kapsamındaki değişkenlere uygulanabilir. C# derleyicisi kodu işlerken mantıksal bir paradoksla karşılaşacağı için, sınıf alanları için örtük yazma kullanılamaz: derleyicinin alanın türünü bilmesi gerekir, ancak atama ifadesi analiz edilene kadar türü belirleyemez ve ifade türü bilinmeden değerlendirilemez. Aşağıdaki kodu inceleyin:

private var bookTitles;

bookTitles türü varverilen bir sınıf alanıdır. Alanın değerlendirilecek bir ifadesi olmadığından, derleyicinin ne tür bookTitles olması gerektiğini çıkarması mümkün değildir. Buna ek olarak, alana bir ifade eklemek (yerel değişken için yaptığınız gibi) de yetersizdir:

private var bookTitles = new List<string>();

Derleyici kod derlemesi sırasında alanlarla karşılaştığında, kendisiyle ilişkilendirilmiş ifadeleri işlemeden önce her alanın türünü kaydeder. Derleyici ayrıştırmaya bookTitlesçalışırken aynı paradoksla karşılaşır: alanın türünü bilmesi gerekir, ancak derleyici normalde ifadeyi analiz ederek türünü belirler varve bu türü önceden bilmeden mümkün değildir.

Bunun, sorgu değişkeninin var tam olarak oluşturulduğu türün belirlenmesinin zor olduğu sorgu ifadelerinde de yararlı olabileceğini fark edebilirsiniz. Bu, gruplandırma ve sıralama işlemleriyle oluşabilir.

Anahtar var sözcük, değişkenin belirli türünün klavyede yazılması sıkıcı olduğunda veya açıkça belli olduğunda veya kodun okunabilirliğine eklenmediğinde de yararlı olabilir. var Bu şekilde yararlı olan örneklerden biri, grup işlemleriyle kullanılanlar gibi iç içe genel türlerdir. Aşağıdaki sorguda, sorgu değişkeninin türü şeklindedir IEnumerable<IGrouping<string, Student>>. Siz ve kodunuzu koruması gereken diğer kişiler bunu anladığı sürece, kolaylık ve kısalık için örtük yazma kullanmakta sorun yoktur.

// 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;

kullanımı var kodunuzun basitleştirilmesine yardımcı olur, ancak kullanımı gerekli olduğu veya kodunuzun okunmasını kolaylaştırdığı durumlara göre kısıtlanmalıdır. Ne zaman düzgün kullanılacağı var hakkında daha fazla bilgi için C# Kodlama Yönergeleri makalesinin Örtük olarak yazılan yerel değişkenler bölümüne bakın.

Ayrıca bkz.