14 Şubat 2018 Çarşamba

C# Dynamic Tipler


C# bilindiği üzere sıkı tip denetimli bir dildir. Bu şu demek oluyor: Eğer bir tip derleme sırasında atandığı bir tip ile uyuşmuyorsa derleme başarısız olacak (hata verecek) demektir. Bazen derleme zamanında da değişken tipli tanımlamalara ihtiyaç olabilir. C# 4.0 bu esnekliği sağlamak için yeni bir tip eklemiştir: dynamic tipi. dynamic tipi tabiri caizse kılıktan kılığa girebilir, bukalemun gibi renk değiştirebilir :) dynamic tipi bütün tiplere dönüştürülebilir. Eee C#1.0'la gelen object tipi de bize bu esnekliği sağlıyordu ne gerek vardı derseniz onu da birazdan anlatacağım.

Aşağıdaki örnekle başlayalım:

class DynamicTypes { static void Main() { dynamic i; dynamic s; i = 10; s = "Bu bir string'tir"; Console.WriteLine("i'nin tipi: " + i.GetType()); Console.WriteLine("i'nin değeri: " + i); //i'ye int tipiymiş gibi davranalım. i = i * 10; Console.WriteLine("i'nin yeni değeri: " + i); Console.WriteLine("str'nin tipi: " + s.GetType()); Console.WriteLine("str'nin değeri: " + s); //s'ye string tipiymiş gibi davranalım. s = s.ToUpper(); Console.WriteLine("s'nin yeni değeri: " + s); i = "i'nin tipi değişti";//Bu atamayla i'nin tipi otomatik olarak değişti Console.WriteLine("i'nin değeri: " + i); Console.WriteLine("i'nin yeni tipi: " + i.GetType()); } }

Bu ekranın çıktısı aşağıdaki gibi olacaktır:

i'nin tipi: System.Int32
i'nin değeri: 10
i'nin yeni değeri: 100

str'nin tipi: System.String
str'nin değeri: Bu bir string'tir
s'nin yeni değeri: BU BİR STRİNG'TİR

i'nin değeri: i'nin tipi değişti
i'nin yeni tipi: System.String

Bu programı biraz yakından inceleyelim:

Öncelikle; dynamic i; diye bir değişken tanımladık. i'ye 10 değerini atadık. Derleyici bunun tipini otomatik olarak int olarak algıladı (int olduğunu i.GetType() ile yazdırınca gördük). Çünkü 10 int tipindedir. Aynı şey dynamic s için de geçerli. Atanan değer karakter katarı olduğundan otomatik olarak string tip algılaması yapıldı. Fakat şu noktaya özellikle dikkat edelim: ilerleyen satırlarda int tipinde olan i değişkenine string bir değer ataması yapılıyor. Derleyici bunu derlemekle birlikte, üstelik çalışma zamanında da hata vermedi. i'nin bundan sonraki tipi string oldu.

dynamic tipi, tip uyumsuzluğu derleme sırasında anlaşılamaz. Ancak çalışma zamanında tip uyumsuzluğu ortaya çıkarsa exception fırlatır. Örneğin aşağıdaki kod derleme zamanında hata almaz ama çalışma zamanında tip uyumsuzluğu hatası fırlatır.

dynamic s; s = "karakter katarı"; s = s * 2; //Çalışma zamanı hatası!! string ile int çarpılamaz!!

Önce dynamic tip string tipine dönüşüyor. Sonra 2 ile çarpılmaya çalışıyor. string ile int haliyle çarpılamaz ve hata fırlatır.

Buraya kadar dynamic tipin ne olduğunu az çok anladık. Şimdi gelelim dynamic ile object arasındaki farklara..

dynamic ile object Tipleri Arasındaki Fark


dynamic ile object arasındaki en temel fark, derleme zamanındaki tip uyumsuzluğu kontrolüdür. Bildiğiniz üzere object tipini kullanabilmemiz için unboxing (kutudan çıkarma) yapmamız gerekiyor. Yani bir tip object olarak tanımlanmışsa, karşı tarafta bunun tipinin ne olacağını belirtmeliyiz.

Console.WriteLine(obj.GetType());//int yazar obj = obj + 1; //Derleme hatası!!! obj'nin tipini belirtmeliyiz obj = (int)obj + 1; //Şimdi çalıştı...

Fakat dynamic tipi için böyle bir işleme gerek yok. dynamic tipler derleme sırasında hata almazken, object tipler için ise unboxing yapmalı, tipini açıkça belirtmeliyiz. Kısaca dynamic tipler bizi derleme hataları zahmetinden kurtarmaktadır. Fakat dynamic tipler her zaman güvenli bir program sunmayabilirler. Dikkatli kullanılmadığında çalışma zamanı hatalarına yol açabilirler. Bundan dynamic tipleri kullanmaktan kaçınmalıyız anlamı çıkarılmamalıdır. Tam tersine dynamic tip kullanımı bazen oldukça elverişli ve gerekli olabilmektedir.

var Anahtar Sözcüğü


dynamic tipleri anlatıp var tipinden bahsetmemek olmazdı. var tipi de tıpkı dynamic tipler gibi herhangi bir tipte bir değişken değeri olabilir. Temel düzeyde javascript biliyorsanız javascriptteki var tanımlayıcısıyla çok benzerlik gösterir. Peki aralarında ne gibi farklar var?

var ile dynamic Tipler Arasındaki Farklar


Yukarda var tipinin de değişken tiplerde değer alabildiğini ifade etmiştik. dynamic tiplerden bazı farklarla ayrılır. dynamic tipler null olabiliyorken var tipleri mutlaka bir başlangıç değerine sahip olmalıdır. Ayrıca ilk atanan tip neyse program sonlanana kadar aynı tipte olmak zorundadır. Bunu bir örnekle açıklayalım.

dynamic x = null; x = 10; //x int tipinde x = x + 10; //x yine int tipinde x = "string değer"; //Geçerli ifade: x burda string tipine dönüştü. var y = null; //Hata!! null değer ataması yapılamaz! var y = 10; //y değişkeni int tipinde bir ilk değer almıştır. y = "string değer"; //Hata!! y yukarda ilk değeri int almıştı. string değer ataması yapılamaz

Buraya kadar object, dynamic ve var gibi dinamik tiplerden bahsetttik. Aşağıda bu üç dinamik tip arasındaki farkları tablo halinde bulabilirsiniz.

object, dynamic ve var Arasındaki Farklar


objectdynamicvar
object .NET Framework içindeki herhangi bir tipte bir değişken olabilir.Herhangi bir tipte bir değişken olabilirHerhangi bir tipte bir değişken olabilir fakat bir başlangıç değerine sahip olmalıdır.

Derleyici nesne hakkında bilgi sahibidir.

Derleyici nesne hakkında bilgi sahibi değildir. Intellisense ile "." dan sonra herhangi bir seçenek çıkmaz.

Derleyici nesne hakkında bilgi sahibidir. nesne hangi tipteyse ona göre intellisense ile bilgi edinmek mümkündür.

Bir metoda parametre olarak gönderilebilir veya bir metodun dönüş tipi olabilir.Bir metoda parametre olarak gönderilebilir veya bir metodun dönüş tipi olabilir.Bir metoda parametre olarak geçilemez ya da bir metodun dönüş tipi olamaz.

Tip ataması yapıldığında boxing - unboxing yapılmak zorundadır.Tip dönüşümü (boxing - unboxing) gerekmemektedir.Tip dönüşümü (boxing - unboxing) gerekmemektedir.
unboxing sırasında tip dönüştürülemezse hata fırlatır.

Tip dönüşümü hataları derleme zamanında anlaşılmaz ancak çalışma zamanında tip dönüştürülemezse hata fırlatır.

Tip dönüşümü derleme sırasında gerçekleşir. Hata varsa derleme yapılmaz.

Genel hatlarıyla dynamic tipleri anlatmaya çalıştım.

Umarım faydalı olabilmişimdir...

Hepinize iyi kodlamalar dilerim :)


Paylaş:

0 yorum:

Yorum Gönder

Bu Blogda Ara