C# Dynamic (Dinamik) Tip Kullanımı

Dynamic (Dinamik) anahtar kelime C# 4.0’da tanıtılan her tip veriyi depolayabilen bir özel tiptir. Ama tip güvenliği olmayan bir yapıdır. Yani, bir değişken veya nesne dynamic olarak tanımlandığında, bu nesnenin tipi derleme zamanında belirlenmez; tip bilgisi çalışma zamanında çözümlenir. dynamic türü, .NET Framework’ün dinamik bir dil gibi davranmasını sağlar.

dynamic türü, C#’ın statik tip güvenliği prensiplerinden sapmamızı sağlar ve bazı durumlarda esnekliğe ihtiyaç duyduğumuzda kullanışlı olabilir. dynamic tipi genellikle aşağıdaki senaryolarda kullanılır:

  1. COM Nesneleriyle Etkileşim: COM (Component Object Model) nesneleri gibi COM bileşenleriyle etkileşim sırasında dynamic türü kullanılabilir.
  2. JSON veya XML İşlemleri: Dinamik olarak yapılandırılmış JSON veya XML verilerini işlerken dynamic türü kullanılabilir.
  3. Reflection ile Çalışma: Reflection işlemleri sırasında dynamic türü kullanarak nesnelerin özelliklerine ve yöntemlerine erişebiliriz.

Kullanımı:

1. Main Method içerisine, aşağıdaki kodda gösterildiği gibi dynamic bir değişken bildirmek ve bir değer atamak için ifadeyi ekleyin:

// bir string değer saklama
dynamic name = "Ahmed";

2. Aşağıdaki kodda gösterildiği gibi, dize değerinin uzunluğunu almak için bir ifade ekleyin:

Console.WriteLine(name.GetType());

Derleyici dinamik tipleri object tiplerinde derler. Yani derleme zamanı esnasında tip dönüşümünü gerçekleştirmez, bir dynamic tip değişkeninin gerçek tipi, çalışma zamanında çözülecektir.

Sonuç:

System.String

Dinamik tipler, atanan değere göre çalışma zamanında tipleri değiştirir. Aşağıdaki örnek, bir dinamik değişkenin atanan değere göre tipi nasıl değiştirdiğini gösterir.

static void Main(string[] args)
{
    dynamic MyDynamicVar = 100;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());

    MyDynamicVar = "Hello World!!";
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());

    MyDynamicVar = true;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());

    MyDynamicVar = DateTime.Now;
    Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType());
}

Sonuç:

Value: 100, Type: System.Int32
Value: Hello World!!, Type: System.String
Value: True, Type: System.Boolean
Value: 01-01-2014, Type: System.DateTime

Dynamic Tip ile Nesne Oluşturma

Dynamic bir tip ile bir class üzerinden nesne oluşturduğumuz zaman dynamic tip derleme zamanı esnasında o class’ın metotlarını ve özelliklerini tanımlayamaz.

Not: Dynamic türler için Visual Studio IntelliSense’in desteklenmediğini unutmayın.

public class Program
{
    static void Main(string[] args)
    {       
        dynamic stud = new Student();

        stud.DisplayStudentInfo(5);
 //çalışır.
        stud.DisplayStudentInfo(1, "Bill");// run-time error, no compile-time error
        stud.DisplayStudentInfo("1");// run-time error, no compile-time error
        stud.FakeMethod();// run-time error, no compile-time error
    }
}
public class Student
{
    public void DisplayStudentInfo(int id)
    {
        Console.WriteLine(id);
    }
}

dynamic tipi, tip güvenliği olmayan bir kod yazma gerekliliği olduğunda veya dinamik olarak tip bilgisinin elde edildiği belirli senaryolarda kullanışlı olabilir. Ancak, gereksiz kullanıldığında kodun okunabilirliğini azaltabilir ve hata ayıklama sürecini karmaşıklaştırabilir. Dolayısıyla, dynamic tipinin özenle ve sınırlı bir şekilde kullanılması önemlidir. Çoğu durumda, C#’ın statik tip güvenliği, daha güvenli ve bakımı kolay kod yazma konusunda avantaj sağlar.