C# Anonymous Tipler
C# ta anonim tipler adları olmayan, sadece “read-only” property’leri olan ve runtime esnasında kullanılan sınıflardır. Anonim tipler, veriye yapısal bir şekilde erişim sağlamak için kullanılır ve genellikle geçici veya tek kullanımlık veri yapıları için kullanışlıdır. Diğer sınıflar gibi “method” , “field” ve “event” gibi elemanları yoktur. “object-initializer” ile oluşturulur ve “var” kelimesi ile değişken olarak referans edilir.
Örnek:
var ogrenci= new
{
Id = 10,
School = "Ertuğrul Gazi ilk öğretim okulu",
StudentName = "İsmail kaşan"
};
Anonim tipin property’leri “null”, anonim metot veya poinyer ile set edilemezler. Property’lerine nokta notasyonu(dot notation) ile erişilir. Fakat property’lerin değerleri değiştirilemezdir.
Örnek:
var ogrenci= new
{
Id = 10,
School = "Ertuğrul Gazi ilk öğretim okulu",
StudentName = "İsmail kaşan"
};
Console.WriteLine(ogrenci.Id); // çıktı: 10
Console.WriteLine(ogrenci.School); // çıktı: Ertuğrul Gazi ilk öğretim okulu
Console.WriteLine(ogrenci.StudentName); // çıktı: İsmail kaşan
ogrenci.Id = 2;// Hata: Değer değiştirilemez
ogrenci.StudentName = "Harun"; // Hata: Değer değiştirilemez
Bir anonim tipin property’sine başka bir anonim tip set edilebilir.
Örnek:
var ogrenci = new {
Id = 1,
School= "Seyfullah",
StudentName = "Burak Reis",
Address = new { Id = 1, City = "Ankara", Country = "TR" }
};
Ayrıca, anonim tiplerden oluşan bir dizide oluşturulabilir.
Örnek:
var ogrenciler= new[] {
new { Id = 1, FirstName = "Ali", LastName = "Veli" },
new { Id = 2, FirstName = "Ahmet", LastName = "Muhammet" },
new { Id = 3, FirstName = "Sait", LastName = "Faik" }
};
Önemli: Anonim tip tanımlandığı metot ta her zaman lokal olacaktır. Bir metottan return edilemez. Fakat başka bir metota object parametresi olarak gönderilebilir, ama tavsiye edilmez.
Genellikle anonim tipler “LINQ” nun “Select” ifadesinde koleksiyonun elemanların ait property’leri getirirken oluşturulurlar.
Örnek:
class Program
{
static void Main(string[] args)
{
IList<Ogrenci> ogrenciListesi = new List<Ogrenci>() {
new Ogrenci() { ID = 1, Adi = "Ali", Yas = 18 },
new Ogrenci() { ID = 2, Adi = "Veli", Yas = 21 },
new Ogrenci() { ID = 3, Adi = "Ahmet", Yas = 18 },
new Ogrenci() { ID = 4, Adi = "Mehmet" , Yas = 20 },
new Ogrenci() { ID = 5, Adi = "Sait" , Yas = 21 }
};
var ogrenciler= from o in ogrenciListesi
select new { Id = o.ID, Adi = o.Adi };
foreach(var ogr in ogrenciler)
Console.WriteLine(ogr.Id + "-" + ogr.Adi);
}
}
public class Grenci
{
public int ID { get; set; }
public string Adi { get; set; }
public int Yas { get; set; }
}
// Çıktı:
// 1-Ali
// 2-Veli
// 3-Ahmet
// 4-Mehmet
// 5-Sait
Yukarıdaki örnekte “LINQ” nın “Select” ifadesinde sadece “ID” ve “Adi” propertyleri çekilmiştir. Bu kullanım şekli gereksiz kodun ve datanın bellekte tutulmasını engeller. O yüzden geriye dönen koleksiyonun içinde sadece “Id” ve “Adi” alanları bulunmaktadır.
Aynı şekilde anonim tiplerde direkt olarak “System.Object” tipinden türemektedir. Compiler otomatik olarak bir isim oluşturup ilgili anonim tipe atamaktadır. Her ne kadar kodun içinde bu ismi görünmese de “System.Object” tipinden gelen “GetType” metotu ile bu görüntülenebilir.
Örnek:
static void Main(string[] args)
{
var ogrenci = new { Id = 1, Adi = "Ali", Soyad = "Veli" };
Console.WriteLine(ogrenci.GetType().ToString());
// Çıktı
// <>f__AnonymousType0`3[System.Int32,System.String,System.String]
}
Anonim tipler genellikle “LINQ” sorgularında kullanılır ve sorgu sonucunda elde edilen geçici sonuçları temsil etmek için kullanılır. Özellikle sorgu sonucu birden çok özelliğe sahip ise, bu özelliklerin isimlendirilmesi ve erişimi için anonim tipler kullanılır. Anonim tipler, kodun daha okunabilir ve esnek olmasını sağlar, ancak genellikle sınırlı kullanım süresine sahiptir ve nesne başlatıcısı (new) ile oluşturulurlar.
Anonim tipler, basit veri yapıları için uygun bir seçenek olabilirken, daha karmaşık veya uzun süreli kullanım gerektiren durumlarda sınıf veya yapı tiplerinin tercih edilmesi daha uygundur.
Yararlanılan kaynaklar:
Microsoft CLR via C# Fourth Edition kitabı.