C# 4.0 İle Gelen Yenilikler

Eyl 06, 2013
C# ın önceki sürümlerine bakılırsa C# 1.0’da temel tema geliştirilen ve yönetilen kod iken daha sonra C# 2.0 ile birlikte dile özgü bir yapı eklenmiştir. Son olarak ise C# 3.0 ile birlikte dile bütünleşik sorgulama olarak Türkçeye çevirilen Language Integrated Query (LINQ) C#’a ilave edilmiştir. LINQ ile XML, veritabanı veya nesnelere dille bütünleşik sorgular gönderilmesi imkanı sağlanmıştır. C# 4.0’da ise temel amaç dinamik programlamadır. C# 4.0 ile birlikte gelen önemli yeniliklerden birisi olan Dynamic anahtar kelimesi sayesinde, Python, Ruby veya Javascript ile üretilen nesnelerin C# 4.0 tarafında son bağlayıcı (late-binding) ile ele alınması mümkündür. Hatta var olan .Net nesnelerinin yansıma (reflection) kullanılmadan ele alınması veya COM objelerine ait üyelerin çağırılmasında bu anahtar kelime kullanılabilmektedir.

C# 4.0 şu ana başlıklar altında incelenebilir.
  1. Dinamik tipli Nesneler (Dynamic Typed Objects)
  2. Opsiyonel ve isimlendirilmiş parametreler
  3. Co- ve Contra-Farklılığı

Dinamik Programlama

C# 4.0 ile birlikte dile yeni eklenen özelliklerden biri olan dinamik tipli nesneler sayesinde dinamik programlamaya tam destek verilmektedir. Dinamik tipli nesneleri kısaca tanımlamak gerekirse nesne tiplerinin derleme zamanı yerine çalışma zamanında belirlenmesidir. C# 3.0 ile birlikte dönüş tipinin tahmin edilemediği sonuçları saklamak için var anahtar kelimesi kullanılırken, dinamik tipli nesneleri tanımlamak için ise şimdi dynamic anahtar kelimesi kullanılmaktadır. Bu anahtar kelime derleyiciye tanımlanan nesnenin tipinin derleme zamanında değilde DLR (Dynamic Language Runtime - Dinamik Çalışma Zamanı) olarak isimlendirilen yapı sayesinde çalışma zamanında belirleneceğini bildirmektedir. "Dynamic" anahtar kelimesi "var" anahtar kelimesinden farklıdır.

Bir örnekle açıklamak gerekirse;
İsimleri aynı fakat dönüş tipleri farklı olan metodlara sahip iki tane sınıf tanımlansın.

public class Coffee
{
   public int GetZing()
   {
      return 1;
   }
}

public class Juice
{
   public string GetZing()
   {
      return "Orange";
   }
}

İki object tipinden birini döndüren bir metod alalım.

private static Object GetOneOfThem(int i)
{
   if (i > 10)
   {
      return new Juice();
   }
   else
   {
      return new Coffee();
   }
}

Dynamic anahtar kelimesi kullanılarak methodun hangi tip geri dönüş alacağını bilmeden GetOneOfThem metodu çağrılabilir.

dynamic drink = GetOneOfThem(someVariable);
Console.WriteLine(drink.GetZing());

Çalışma zamanında GetOneOfThem, Juice veya Coffee’yi üretir ve buna bağlı metod derleyicinin drink(içecek) olarak tanımladığı şeyi (juice veya coffee) çağırır.

Optional (Seçimli) Parameters ve Named (İsimlendirilmiş) Parameters Özelliği

Seçimli ve İsimlendirilmiş parametreler özelliği sınıfların yapıcı metodlarındaki parametrelere isim verebilme ve bazı parametreleri opsiyenel bırakabilme imkanı sağlar.

  • Seçimli Parametreler özelliği bir metot çağırımında seçimli parametre yaratmamıza olanak sağlamaktadır. Böylece ilgili metot çağırılırken opsiyonel parametreye değer atanmayabilir ve böyle bir durumda yani değer atanmadığında kullanılacak değerini de önceden tanımlamamız gerekir.
  • İsimlendirilmiş Parametreler özelliği ise metot çağırımında artık parametreleri isimlerini yazarak göndermemize olanak sağlamaktadır. Böylece parametreler artık metod imzasındaki sırayla gönderilmek zorunda değildir.

Örnek:

Öncelikle Kitap sınıfına bir adet Constructor (Yapıcı metod) eklenir ve bu yapıcı metoddaki kategori özelliğine atama yapacak olan parametre "Optional Parameter" olarak tanımlanır. Böylece eğer bu parametreye bir değer atanmazsa kategori otomatik olarak Ana Kategori'ye atanmış olur.

Kodlama kısmı ise şu şekilde olur.

public Kitap(string ad,double fiyat,string kategori= "Ana Kategori" )
{
       Ad = ad;
       Fiyat = fiyat;
       Kategori = kategori;
}

Artık bir kitap nesnesi yaratıldığında eğer kategori parametresi boş geçilirse bu parametre "Ana Kategori" değerini alacaktır.

Kitap kitapTest = new Kitap("TestKitap", 35);
kitapTest.Goster();

C# 3.0 'da bu işlem if kontrolü yapılarak gerçekleştirilirken, C# 4.0 ile birden fazla if kontrolüne gerek kalmadan gerçekleştirilebiliyor.

Named parameters da kitap nesnesi yaratılırken önce adını sonra fiyatını girilmesi gerekirken, bir Seçimli Parametreler ile önce kitabın kategorisi sonra fiyat ve adı girilebilir.

Kitap kitap = new Kitap(kategori: "Yazilim", fiyat:150, ad: "C# 4.0");
kitap.Goster();




Ayrıca seçimli parametreler bir çok aşırı yükleme(overloads) metodlarını ve gereksiz yere karmaşık sınıf yapmayı önlemeye yardımcı olur.

"Co-contra Variance" Özelliği

  • Covariance : Covariance (ortak değişken) özelliği bize tanımlanmış olan bir generic parametreden daha alt tipteki sınıfları göndermemize olanak sağlar.
  • Contravariance : "Contravariance" özelliği ise tanımlanmış bir generic parametreden daha üst tipteki sınıfları göndermemize olanak sağlar.
  • Invariant : Eğer herhangi bir yapıda yukarıdaki özelliklerden hiçbiri geçerli değilse invariant(değişmez değer) olarak adlandırılır.

C# 4.0 ile beraber güvenli "Co-Contra Variance" özelliği ile "Generic Delegate"(temsilci) ve arayüzler tanımlanabilmektedir. Bunun için in ve out anahtar kelimeleri kullanılabilir. "Co-Contra Variance" özelliğini kullanabilmek için nesneler arasında referans dönüştürülmesi mümkün olmalıdır.

Covariant parametre => out : "Out" ile tanımlanmış bir parametre sadece dönüş tipi olarak kullanılabilir.
Contravariant parametre => in : "In" olarak tanımlanmış bir parametre ise sadece aktarılan parametre olarak kullanılabilir.