Ö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 var
dizileri 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 var
bildirilebileceğ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 (var item in list) {...}
-
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 var
baş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ü var
verilen 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 var
ve 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.