Compile zamanında hata vermeyen ama eğer yanlış ya da mantıksız kullanılırsa run-time da hata veren yepyeni bir tipimiz var artık.
Örneğin;
dynamic x= 7;
x.SayHello(); // gibi bir durumda run-time hatası alırız...
ama mesela şöyle aritmetik ortalama yapan bir program parçası için düşündüğümüzde ise gayet kullanışlı olabilir;
static dynamic ortalama(dynamic x, dynamic y)
{
return (x + y) / 2;
}
static void Main()
{
int x = 3, y = 4;
Console.WriteLine (ortalama(x, y));
}
burada kazancımız nedir ? açıkça görebiliriz ki er sayı tipi için ayrı bir metot yazmamıza gerek kalmıyor...
dynamic ve object tipleri aslında birbirlerine çok çok benzerler, öyle ki run-time da
typeof(dynamic)== typeof(object) size true değerini verir, hata almazsınız. Aynı şekilde
typeof (List<dynamic>) == typeof (List<object>)
typeof (dynamic[]) == typeof (object[])
ifadeleri için de geçerlidir...
Object referansında olduğu gibi, dynamic tipini de herhangi bir object tipine refere edebiliriz;
dynamic x = "selam";
Console.WriteLine (x.GetType().Name); // String
x = 123; // hata vermez !
Console.WriteLine (x.GetType().Name); // Int32
Gördüğünüz gibi yapısal olarak object referanslamadan hiçbir farkı yok... Bu şekilde dinamik operasyonlara müsade eden yapılar kurabiliriz ;
object o = new System.Text.StringBuilder();
dynamic d = o;
d.Append ("selam");
Console.WriteLine (o); // selam !
Bir diğer konu da,
public class Test
{
public dynamic Foo;
}
metodunun aşağıdaki metotla aynı olması,
public class Test
{
[System.Runtime.CompilerServices.DynamicAttribute]
public object Foo;
}
Buradaki avantajımız, dynamic tipini desteklemeyen dillerde, kullanıcılar/developerlar object nesnesi kullanarak yollarına devam edebilirler...
Peki bizim var diye bir tipimiz de var, onunla arası nasıl bu dynamic in diye bakacak olursak;
• var şöyle der, “tipin değerlendirmesini derleyiciye(compiler) bırakalım”
• dynamic de şöyle der, “yokabi gerek yok,tipin değerlendirmesini biz çalışma zamanına bırakalım(run-time)”
dynamic x = "selam"; // Static tip dynamic, runtime tipi ise string
var y = "aleykum selam"; // Static tip string, runtime tipi de string
int i = x; // run-time hatası
int j = y; // compile-time hatası alırız...