Immutable Type Kavramı Hakkında

    _dogumTarihi = dogumTarihi;
}

}

private static void Main()
{
var cihan = new Ogrenci
(
ad: "Cihan",
soyad: "Yakar",
dogumTarihi: new Tarih {Gun= 3, Ay = 1, Yil = 1986 }
);

cihan.Yil = 1802;
Console.ReadLine();

}


Bu durumda orijinal `Tarih` nesnesini sakladığımız için sınıfımız dışarıdan gelen değişikliklere kapalı olacaktır. Fakat maalesef gerçek dünyada kullanacağımız sınıflar bu kadar yalın olmayabiliyorlar.  Bu durumda kullanıcının erişim yöntemini biraz değiştirmeniz gerekecektir.

```csharp
internal sealed class Ogrenci
{
    public string Ad { get; }
    public string Soyad { get; }

    private readonly Tarih _dogumTarihi;

    public T DogumTarihi(Expression> erisimFonksiyonu)
    {
      // return erisimFonksiyonu.Compile()(_dogumTarihi); yan etkisi var
        var prop = (PropertyInfo)((MemberExpression)erisimFonksiyonu.Body).Member;
        return (T)prop.GetValue(_dogumTarihi); 
    }
    public Ogrenci(string ad, string soyad, Tarih dogumTarihi)
    {
        Ad = ad;
        Soyad = soyad;
        _dogumTarihi = dogumTarihi;
    }

}

private static void Main()
{
    var cihan = new Ogrenci
    (
        ad: "Cihan",
        soyad: "Yakar",
        dogumTarihi: new Tarih { Gun = 3, Ay = 1, Yil = 1986 }
    );
    var yil = cihan.DogumTarihi(t => t.Yil);
    //   var yil = cihan.DogumTarihi.Get(t => t.Yil);
    Console.WriteLine(yil);
    Console.ReadLine();
}

Burada Linq'in kullandığı yöntemibe benzer bir kullanım yapmış olduk. Kullanıcıdan Tarih sınıfından bir nesne verildiğinde geriye bir şey dönmesini istiyoruz. Kodda oldukça performanslı çalışacak complie satırını kapatıp işi yavaşlatacak reflection yöntemine girişiyorum. Sebebi değişmezliği korumak çünkü kullanıcı isterse cihan.DogumTarihi(t => 1808); yazabilir veya daha kötüsü t üzerinde değişiklik yaptıracak bir metot üzerinden dolaştırmayı deneyebilir. Bu durumda yazılan ifadenin (expression) türü MemberExpression olmayacağı için hata verecektir. Burada performansı düşürdüğüm açıktır. Eğer bir önceki yöntemi uygulayabiliyorsanız onu uygulamanızını öneririm.

Peki ya koleksiyon tipleri? Bir dizi, bir kuyruk vs. olduğunda bunlar için ne yapmak gerekiyor? Bir önceki yöntem normal sınıflar için işe yararken koleksiyon tipleri yorucu olacaktır. Burada ise Microsoft devreye giriyor ve bize şöyle harika bir kütüphane sunuyor : https://msdn.microsoft.com/en-us/library/mt452182(v=vs.111).aspx
Bu kütüphanede neredeyse tüm koleksiyon tiplerinin değişmez karşılıkları bulunuyor. Kullanıcı bizim sınıfımızdan bir List aldığında .Add(...) methodunu yine çağrıabiliyor ama bu tıpkı string.Replace de olduğu gibi çalışıyor. Yani orijinal koleksiyonda hiç bir değişiklik yapmadan geriye yeni ve ilgili değişiklik yapılmış bir koleksiyon dönüyor. Mutlaka deneyin.

Bir kavram yazısının daha sonundayız. Özellikle değinmemi istediğiniz bir kavram varsa bana ulaşabilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir