Örtük olarak yazılan yerel değişkenler (C# Programlama Kılavuzu)
Yerel değişkenler açık bir tür vermeden bildirilebilecek. varAnahtar sözcüğü, derleyiciye, başlatma deyiminin sağ tarafındaki ifadeden değişkenin türünü çıkarmasını söyler. Çıkarsanan tür yerleşik bir tür, anonim tür, Kullanıcı tanımlı tür veya .NET sınıf kitaplığı 'nda tanımlanmış bir tür olabilir. İle dizileri başlatma hakkında daha fazla bilgi için var bkz. örtülü olarak yazılan diziler.
Aşağıdaki örneklerde, yerel değişkenlerin ile bildirilebilecek çeşitli yollar gösterilmektedir 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>();
varAnahtar sözcüğünün "varyant" anlamına gelmeyeceğini ve değişkenin gevşek olarak yazılmış olduğunu veya geç bağlandığını belirtmeyeceğini anlamak önemlidir. Yalnızca derleyicinin en uygun türü belirlediği ve atayacağı anlamına gelir.
varAnahtar sözcüğü aşağıdaki bağlamlarda kullanılabilir:
Yerel değişkenlerde (Yöntem kapsamında belirtilen değişkenler) önceki örnekte gösterildiği gibi.
For Initialization ifadesinde.
for (var x = 1; x < 10; x++)Bir foreach başlatma bildiriminde.
foreach (var item in list) {...}Bir using ifadesinde.
using (var file = new StreamReader("C:\\myfile.txt")) {...}
Daha fazla bilgi için bkz. bir sorgu ifadesinde örtük olarak yazılan yerel değişkenleri ve dizileri kullanma.
var ve anonim türler
Çoğu durumda, kullanımı var isteğe bağlıdır ve yalnızca sözdizimsel bir kolaylık vardır. Ancak, bir değişken anonim bir türle başlatıldığında, var nesnenin özelliklerine sonraki bir noktada erişmeniz gerekiyorsa değişkeni bildirmeniz gerekir. Bu, LINQ sorgu ifadelerinde yaygın bir senaryodur. Daha fazla bilgi için bkz. anonim türler.
Kaynak kodunuzun perspektifinden adsız bir türün adı yoktur. Bu nedenle, bir sorgu değişkeni ile başlatılmış ise var , nesne dizisinde döndürülen özelliklere erişmenin tek yolu, var deyimindeki yineleme değişkeninin türü olarak kullanmaktır 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
*/
Açıklamalar
Aşağıdaki kısıtlamalar, örtük olarak belirlenmiş değişken bildirimleri için geçerlidir:
varyalnızca yerel bir değişken aynı deyimde bildirildiği ve başlatıldığı zaman kullanılabilir; değişken null veya bir yöntem grubuna veya anonim işleve başlatılamaz.varsınıf kapsamındaki alanlarda kullanılamaz.Kullanılarak belirtilen değişkenler
varbaşlatma ifadesinde kullanılamaz. Diğer bir deyişle, bu ifade geçerlidir:int i = (i = 20);ancak bu ifade derleme zamanı hatası oluşturur:var i = (i = 20);Birden çok örtük olarak yazılmış değişkenler aynı ifadede başlatılamaz.
Adlandırılmış bir tür
varkapsamdadır,varanahtar sözcüğü bu tür adına çözümlenir ve örtük olarak yazılmış bir yerel değişken bildiriminin parçası olarak değerlendirilmez.
Anahtar sözcükle örtük yazma var yalnızca yerel Yöntem kapsamındaki değişkenlere uygulanabilir. C# derleyicisi kod işlendiği için bir mantıksal Paradox ile karşılaşacağından, sınıf alanları için örtük yazma kullanılamaz: derleyicinin alanın türünü bilmesi gerekir, ancak atama ifadesi çözümlenene kadar türü belirleyemez ve ifade türü bilmeden değerlendirilemiyor. Aşağıdaki kodu inceleyin:
private var bookTitles;
bookTitles , türü verilen bir sınıf alanıdır var . Alanın değerlendirilecek bir ifadesi olmadığından, derleyicinin ne tür olması gerektiğini çıkarması olanaksızdır bookTitles . Ayrıca, alana bir ifade eklemek (yerel bir değişken gibi) de yeterli değildir:
private var bookTitles = new List<string>();
Derleyici kod derleme sırasında alanlarla karşılaştığında, onunla ilişkili herhangi bir ifadeyi işlemeden önce her alanın türünü kaydeder. Derleyici ayrıştırmaya çalışan aynı Paradox ile karşılaştığında bookTitles : alanın türünü bilmesi gerekir, ancak derleyici, bu türü var önceden bilmeden ifadeyi analiz ederek normalde türünü tespit edecektir.
varSorgu değişkeninin tam olarak oluşturulan türünün belirlenmesi zor olduğu sorgu ifadeleri ile de yararlı olabileceğini fark edebilirsiniz. Gruplandırma ve sıralama işlemlerinde bu durum oluşabilir.
varAnahtar sözcüğü, değişkenin belirli türü klavyede yazmak sıkıcı veya belirgin olduğunda ya da kodun okunabilirliğini eklememe olduğunda da yararlı olabilir. varBu şekilde yararlı olduğu bir örnek, Grup işlemleriyle kullanılanlar gibi iç içe geçmiş genel türlerdir. Aşağıdaki sorguda, sorgu değişkeninin türü IEnumerable<IGrouping<string, Student>> . Siz ve kodunuzun bakımını yapmak zorunda olan başkaları bunu anlamış olduğu sürece, kolaylık ve kısaltma için örtük yazma kullanmayla ilgili bir 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ı gereken durumlarda veya kodunuzun daha kolay okunması durumunda kullanılması gerekir. Düzgün olarak ne zaman kullanılacağı hakkında daha fazla bilgi için var C# kodlama yönergeleri makalesindeki örtülü olarak yazılan yerel değişkenler bölümüne bakın.