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
object | dynamic | var |
object .NET Framework içindeki herhangi bir tipte bir değişken olabilir. | Herhangi bir tipte bir değişken olabilir | Herhangi 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 :)