İçeriğe geç

Anonymous Types ve Dynamic: C#’ta Nesne Yönetiminin Gizemli Yüzü

Yaşadığım şehir Bursa’da kış ayları malum, insanın içini ısıtan bir şeyler yapmak istiyor. Geçenlerde eşimle eski fotoğraflarımıza bakıyorduk, o zamanlar lise sondaydım sanırım, bir de ne göreyim, ilk defa bir forum sitesinde yazdığım bir makale! Konusu da ne olsun, tabii ki C# ile ilgili bir şeyler. Hatırlıyorum da o zamanlar her şeyi ne kadar hevesle öğreniyordum, şimdi bakınca kendi yazdıklarıma gülüyorum ama o heyecan hâlâ içimde bir yerlerde duruyor sanki. Neyse efendim, konumuza dönelim.

Şimdi bu Anonymous Types ve Dynamic olayları var ya, C# dünyasında bazı şeyleri gerçekten çok kolaylaştırıyor, ama bazen de insanı birazcık düşündürüyor. Hani böyle bir program yazıyorsun, bir sürü veri geliyor, bu verileri nasıl gruplayacaksın, nasıl kullanacaksın? İşte tam burada bu iki arkadaş devreye giriyor.

Öncelikle Anonymous Types’a bir bakalım. Adı üstünde, anonim tipler. Yani sen gidip ‘public class Urun { public string Ad { get; set; } … }’ diye bir sınıf tanımlamıyorsun. Veriyi alıyorsun, kullanacağın kadarını seçiyorsun, al sana yeni bir tip. Bu tipin adı yok, sadece o anlık kullanacağın bir yapı. Ne güzel değil mi? Kendi programımı yazarken bazen sırf bir tane alan için sınıf tanımlamak istemiyorum, işte o zaman Anonymous Types hayat kurtarıyor.

Mesela bir veritabanından veri çekiyorsun, ama sana gelen her alan lazım değil. Sadece ürün adı ve fiyatı lazım. O zaman şöyle bir şey yapabiliyorsun:

var urunBilgisi = new { Ad = "Laptop", Fiyat = 15000m };

İşte bu kadar! Artık ‘urunBilgisi’ diye bir değişkenin var ve bu değişkenin içinde sadece ‘Ad’ ve ‘Fiyat’ var. Başka hiçbir şey yok. Bu, kodunu daha temiz tutuyor, gereksiz sınıf tanımlamalarından kurtarıyor. Tabii ki bu tipler sadece tanımlandıkları scope’ta geçerli oluyor, yani bir metottan diğerine doğrudan geçiremiyorsun ama o anlık ihtiyaçları karşılıyor işte.

Şimdi gelelim Dynamic’e. Bu biraz daha farklı bir dünya. Dynamic, derleme zamanında değil, çalışma (runtime) zamanında tür denetimi yapıyor. Yani sen bir değişkeni ‘dynamic’ olarak tanımladığında, ona istediğin özelliği veya metodu atayabiliyorsun. Bu, başta süper bir esneklik gibi görünüyor, değil mi? Özellikle dışarıdan gelen verilerle uğraşırken, mesela JSON verilerini işlerken falan çok işe yarıyor. Hani bazen gelen verinin yapısı tam olarak belli değil, ne olacağı meçhul. İşte o zaman dynamic ile o veriyi alıp, sanki o yapı varmış gibi kullanabiliyorsun.

Ama işte burada da bir ‘ama’ var. Dynamic kullanırken dikkatli olmak lazım. Çünkü derleme zamanında hata yakalayamıyorsun. Yani sen kodu yazarken her şey yolunda gidiyor sanıyorsun, ama programı çalıştırdığında, o dynamic değişkene atadığın özellik yoksa, yandın! Program patlıyor. Bana da oldu bir kere, kendi yazdığım bir programda böyle bir hata yüzünden saatlerce uğraşmıştım. Basit bir yazım hatası yüzünden bütün akış bozulmuştu. İşte o zaman dedim ki, dynamic harika ama dikkatli kullanmak lazım.

Bu arada, C# 4.0 ile gelen dynamic özelliği, COM nesneleriyle falan da uğraşırken işleri kolaylaştırıyor. Eskiden bu tür şeylerle uğraşmak biraz daha zahmetliydi. Şimdi daha akıcı bir şekilde kod yazabiliyorsun.

Bir de şöyle bir karşılaştırma yapalım. Diyelim ki elinde bir JSON string’i var ve bu JSON’u parse etmek istiyorsun. Anonymous types kullanacaksan, önce bir sınıf tanımlaman lazım, sonra JSON’u o sınıfa deserialize edersin. Dynamic kullanacaksan, doğrudan dynamic bir değişkene atayıp, sonra istediğin property’e erişirsin. Mesela şöyle:

// Anonymous Type ile (Örnek, gerçek parse işlemi daha detaylı) public class PersonData {     public string Name { get; set; }     public int Age { get; set; } } // ... // var personObject = JsonConvert.DeserializeObject<PersonData>(jsonString); // Console.WriteLine(personObject.Name);

// Dynamic ile (Örnek, gerçek parse işlemi daha detaylı) // JObject dynObject = JObject.Parse(jsonString); // dynamic dynamicPerson = dynObject; // Console.WriteLine(dynamicPerson.Name);

Şimdi burada Anonymous Type daha güvenli, çünkü derleme zamanında `Name` property’sinin varlığını kontrol edebiliyorsun. Dynamic ise daha esnek ama çalışma zamanı hatalarına daha açık. Hangisini kullanacağına, projenin ihtiyacına ve risk toleransına göre karar vermek en doğrusu sanırım.

Neticede, Anonymous Types ve Dynamic, C# geliştiricilerine sunulmuş güçlü araçlar. Anonymous Types ile geçici, adlandırılmamış veri yapıları oluşturup kodunu sadeleştirebilirsin. Dynamic ile ise çalışma zamanında esneklik kazanabilirsin. Fakat unutmamak lazım ki, her güçlü aracın bir de riski var. Dynamic kullanırken özellikle dikkatli olmak, olası hataları öngörmek ve ona göre önlemler almak gerekiyor. Yoksa benim gibi bir yerde takılıp kalırsın 🙂

Bursa’da bazen hava o kadar güzel oluyor ki, insan kendini dışarı atmak istiyor. Geçen hafta sonu eşimle bir kamp planladık, tam hazırken hava birden bozdu. Neyse ki çabuk toparlandı da birkaç saatliğine de olsa doğayla iç içe olabildik. Bu tür anlar insana hem enerji veriyor hem de bazen bilgisayar başından kalkıp farklı şeylere odaklanmanın ne kadar önemli olduğunu hatırlatıyor.

Eğer bu konu hakkında daha fazla bilgi almak istersen, Microsoft’un kendi dokümantasyonuna bakabilirsin. Orada da bolca örnek ve açıklama bulabilirsin. Anonymous Types ve Dynamic Types hakkında detaylı bilgi orada mevcut. Bu arada, YouTube’da da bu konularda harika anlatımlar var, bir göz at istersen.

Sonuç olarak, bu iki özellik sayesinde kod yazmak daha keyifli hale geliyor. Ama her zaman olduğu gibi, bilginin gücüyle birlikte sorumluluğu da getiriyor. Bu yüzden bu araçları bilinçli kullanmak, hem senin hem de projenin sağlığı için en iyisi olacaktır. Ne dersin?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.