Visual Studio’da kullanmakta olduğum ReShapper uzantısının; int, double, string, bool gibi veri tiplerinde tanımlanmış değişkenlerde dahi “var” anahtar sözcüğünün kullanımını önermesi üzerine, “var” anahtar sözcüğünün performans üzerinde bir artısı olup olmadığını araştırıp, konuya ilişkin bir içerik yayınlamaya karar verdim.
Performans Üzerindeki Etkisi
“var” anahtar sözcüğü ile belirttiğimiz değişkenlerin veri tipleri, derleme anında, değişkenlere atadığımız değerlere göre belirlenmektedir.
int number_1 = 10; var number_2 = 15;
Yukarıdaki kod satırlarında; number_1 değişkeninin veri tipi “int” olarak açık bir şekilde belirtilmişken, number_2 değişkeninin “var” anahtar sözcüğü ile belirtildiğini görmekteyiz.
.locals init ( [0] int32 number_1, [1] int32 number_2 )
Derleme işlemi sırasında oluşturulan ara kodu (IL) inceleyecek olursak, her iki değişkeninde “int” tipinde olduğunu görürüz. Yani “var” anahtar sözcüğü ile belirtilen number_2 değişkeninin veri tipi derleme anında “int” olarak belirlenmiştir. Her iki değişkenin de veri tipi çalışma anında int tipinde olacağından, iki kod satırı arasında herhangi bir performans farkı olmayacaktır. Tek fark; derleme anında number_1 değişkeni direkt “int” olarak işleme koyulurken, number_2 değişkeni, içerisine atanan değer incelendikten sonra “int” olarak işleme koyulacaktır, bu da her ne kadar derleme anında bir zaman kaybına neden olsa da çalışma anında herhangi bir zaman ve performans kaybına neden olmayacaktır.
Okunabilirlik Üzerindeki Etkisi
Değişkenlerin veri tiplerini açık bir şekilde belirtmek ile “var” anahtar sözcüğünü kullanmak arasında herhangi bir performans farkı olmadığına göre, konuyu diğer bir kıstasımız olan okunabilirlik üzerinden irdeleyerek devam edebiliriz.
“When you come to work, you are not writing code for you, you’re writing code for those who come after you”
– Nicolas C. Zakas
Dictionary<string, Person> persons_1 = new Dictionary<string, Person>(); // veya var person_2 = new Dictionary<string, Person>();
İki kod satırı arasında herhangi bir performans farkı olmayacağını derleme işlemi sırasında oluşturulan ara kodu (IL) inceleyecek doğrulayabiliriz.
.locals init ( [0] class [mscorlib]System.Collections.Generic.Dictionary`2<string, class ConsoleApp8.Person> persons_1, [1] class [mscorlib]System.Collections.Generic.Dictionary`2<string, class ConsoleApp8.Person> person_2 )
Okunabilirlik açısından değerlendirdiğimiz zaman da iki kod satırı arasında bir fark olmadığını söyleyebiliriz. Sonuçta bir programcı, ilk bakışta person_1 ve person_2 referanslarının, değer (value) olarak Person sınıfından oluşturulan nesneleri tutan bir Dictionary koleksiyonunu işaret ettiğini anlayacaktır. GitHub üzerinden incelediğim projelerde, çoğu programcının böylesi bir durumda daha kısa kod satırları elde etmek için “var” anahtar sözcüğünü tercih ettiğini görmekteyim.
List<Person> people_1 = People.GetPeople(); // veya var people_2 = People.GetPeople();
Yukarıdaki örneği inceleyecek olursak; ilk satırı gören bir programcı “GetPeople()” metodunun, içerisinde Person sınıfı nesnelerinin bulunduğu bir List koleksiyonu döndürdüğünü direkt anlayacaktır ama “var” anahtar sözcüğünün kullanıldığı kod satırında bunu ilk bakışta anlaması mümkün olmayacaktır. Bu yüzden böylesi bir durumda, kodlarımızın daha okunur olması için “var” anahtar sözcüğünü kullanmak yerine veri tipini açık bir belirtmeyi tercih edebiliriz.
var persons = new Dictionary<string, Person>(); foreach (KeyValuePair<string, Person> person in persons) { } // veya foreach (var person in persons) { }
Son olarak yukarıdaki örneği inceleyecek olursak; programcının persons referansında bir Dictionary’i nesnesinin tutulduğunu bildiğini farz edersek, “KeyValuePair” kullanmak yerine kısa olması açısından “var” anahtar sözcüğünü kullanmayı tercih edebiliriz.
Özetle; “var” anahtar sözcüğünün çalışma performansı üzerinde olumlu veya olumsuz herhangi bir etkisi bulunmamaktadır. Bu yüzden okunabilirliği zayıflatmayacağını düşündüğünüz durumlarda, daha kısa kod satırları elde etmek için kullanabilirsiniz.
“var” Niçin Var?
Her ne kadar “var” anahtar sözcüğü yaygın olarak kod satırlarını kısaltmak için kullanılsa da asıl kullanım amacı, veri tipi belli olmayan anonim türdeki verilerin bir değişkende tutulmasını sağlamaktır.
List<Person> persons = People.GetPeople(); var anonymousData = persons.Where(x => x.country == "Turkey") .Select(x => new { x.fullName, x.phoneNumber }).ToList(); foreach (var item in anonymousData) { Console.WriteLine("Full Name={0}, Phone Number={1}", item.fullName, item.phoneNumber); }
anonymousData değişkenini “var” anahtar sözcüğü ile tanımlamamış olsaydık, sadece fullName ve phoneNumber özelliklerini içeren nesneler oluşturabilmek için yeni bir sınıf oluşturmamız gerekirdi. Ancak “var” anahtar sözcüğü bu gereksinimini ortadan kaldırdı.
Serdar YILMAZ
Olumluu 😀
Yalnızca hobi olarak yazılım öğrenme çabası içindeyim, Web tararken yazdıklarınıza denk geldim. Temiz ve anlaşılır ifadelerle değerli bilgiler vermişsiniz. Teşekkür ederim. Keşke AÖF’de yazılım dersi verenler de yazdıklarınızdan yararlansa..