C# Nullable Tipler İçin Extension Methods ve Helper Method Kullanımı

Öncelikle Nullable tipler , Extension Methods ve Helper Method kavramlarını açıklayarak başlayalım. Daha sonra da Nullable tipler için kullanılacak örnek sınıflarımıza değinelim.

1 – Nullable Tipler :

C# ta Nullable tipler framework 2.0 ile birlikte gelmiştir. Nullable tipteki bir değişkene hem kendi türünden bir değer hemde null değer atanabilmektedir. Nullable tipler, tip tanımlaması sonuna ? konularak belirtilir. Örneğin: int? , DateTime? , bool? gibi.

Örnek bir class ve property üzerinde çalışalım.

 

public class Test
{

    private int? _sayi;

    public int? Sayi
    {
        get { return _sayi; }
        set { _sayi = value; }
    }

    public Test()
    {
    }

}

 

Bir butonumuz ve bir textbox ımız olduğunu varsayalım. Butona tıkladığımızda yukarıdaki class tan bir nesne türetip textbox tan gelen değeri Sayi property sine atayalım. Genel kullanım tarzı aşağıdaki gibi olacaktır.

Test t = new Test();

if (!string.IsNullOrEmpty(textbox1.Text))
    t.Sayi = Convert.ToInt32(textbox1.Text);
else
    t.Sayi = null;

 

Bu atama işlemini biraz daha kısa yazmak istersek aşağıdaki gibi yazabiliriz :

Test t = new Test();
t.Sayi = string.IsNullOrEmpty(textbox1.Text) ? (int?)null : Convert.ToInt32(textbox1.Text);

 

2 – Extension Methods :

Her atama işleminde örneklerdeki kadar çok kontrol yerine daha kısa yöntemler geliştirmek te mümkündür. Framework 3.5 ile birlikte Extension Methods desteği gelmiştir. Extension Methods desteği ile birlikte framework te var olan tiplere yeni metodlar ekleyebiliriz. Yazacağımız class ve metodlar static olmalıdır. Buradaki en önemli ayrıntı IkiKati metodu parametresi olan string str önündeki this anahtar sözcüğüdür. Bu kelime ile artık string türüne yeni bir metod daha kazandırmış oluyoruz.

Örneğin string bir değişkenin int e çevrilebiliyorsa 2 katını alan metod yazalım.

public static class StringExtensions
{
    public static int? IkiKati(this string str)
    {
        int i;
        if (Int32.TryParse(s, out i)) return i*2;
        return null;
    }
}

Evet sıra geldi bu metodun nasıl kullanılacağına. Biz stirng türü için bir metod yazdığımıza göre kullanım şekli de stringDegisken.IkiKati() biçimindedir.

Örnek olarak str değişkeninin değerini int e çevirerek iki katını Sayi değişkenine atamayı gösterelim.

string str = "3";
int? Sayi = str.IkiKati();

Bu şekilde çok kullandığınız metodları Extension Methods türüne çevirip bir dll haline getirerek bir çok projede kullanabilirsiniz.

 

3 – Helper Method :

Peki uygulamamız Framework 2.0 desteği ile geliştiriliyorsa Extension Methods özelliğini nasıl kullanabiliriz. Bunun cevabı da Helper Method olacaktır. Kullanımı Extension Methods a göre farklı ancak sizin zaten bildiğiniz fonksiyon kullanımından farklı olmadığını göreceksiniz.

Helper Class Örneği:

public static class StringHelper
{
    public static int? IkiKati(string str)
    {
        int i;
        if (Int32.TryParse(s, out i)) return i*2;
        return null;
    }
}

Helper Class Kullanımı :

string str = "3";
int? Sayi = StringHelper.IkiKati(str);

Bu açıklamalardan sonra her iki konu için örnek sınıflarımıza geçebiliriz.

 

4 – Nullable Tipler İçin Extension Methods Sınıfı :

Uygulamalarınız Framework 3.5 ve daha yukarı bir sürüme göre geliştiriliyorsa aşağıdaki sınıfı projenize dahil ederek kullanabilirsiniz. En çok ihtiyaç duyulan Nullable tipler için yazdığım örnek sınıf aşağıdadır.

public static class StringExtensions
{
    public static int? ParseNullableInt32(this string s)
    {
        int i;
        if (Int32.TryParse(s, out i)) return i;
        return null;

    }
    public static long? ParseNullableInt64(this string s)
    {
        long i;
        if (long.TryParse(s, out i)) return i;
        return null;
    }
    public static DateTime? ParseNullableDateTime(this string s)
    {
        DateTime i;
        if (DateTime.TryParse(s, out i)) return i;
        return null;
    }
    public static decimal? ParseNullableDecimal(this string s)
    {
        decimal i;
        if (decimal.TryParse(s, out i)) return i;
        return null;
    }
    public static double? ParseNullableDouble(this string s)
    {
        double i;
        if (double.TryParse(s, out i)) return i;
        return null;
    }
}

Bu metodları kullanarak Nullable türden bir değişkene değer ataması yapabilirsiniz. Eğer atamak istediğiniz değer o türe dönüştürülebiliyorsa değer atanır dönüştürelemez ise null değer atanır.

Örnek : Bir textbox tan gelen veriyi Personel sınıfının ilgili property sine atanması.

Personel p = new Personel();
p.KayitTarihi = txtKayitTarihi.Text.ParseNullableDateTime(); //p.KayitTarihi DateTime? dir.
p.Save();

5 – Nullable Tipler İçin Helper Method Sınıfı :

Projeleriniz Framework 2 desteğine göre geliştiriliyorsa Nullable tipler için aşağıdaki Helper Method sınıfını kullanabilirsiniz. 

public static class StringHelper
{
    public static int? ParseNullableInt32(string s)
    {
        int i;
        if (Int32.TryParse(s, out i)) return i;
        return null;
    }
    public static long? ParseNullableInt64(string s)
    {
        long i;
        if (long.TryParse(s, out i)) return i;
        return null;
    }
    public static DateTime? ParseNullableDateTime(string s)
    {
        DateTime i;
        if (DateTime.TryParse(s, out i)) return i;
        return null;
    }
    public static decimal? ParseNullableDecimal(string s)
    {
        decimal i;
        if (decimal.TryParse(s, out i)) return i;
        return null;
    }
    public static double? ParseNullableDouble(string s)
    {
        double i;
        if (double.TryParse(s, out i)) return i;
        return null;
    }
}

Örnek:

Personel p = new Personel();
p.KayitTarihi = StringHelper.ParseNullableDateTime(txtKayitTarihi.Text); //p.KayitTarihi DateTime? dir
p.Save();

Özellikle katmanlı uygulamalarda veritabanındaki nullable alanlara atama yapmak istediğinizde çok işinize yarayacaktır.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPin on PinterestShare on RedditDigg thisEmail this to someonePrint this page

Post Author: mustafaozcan

Bir Cevap Yazın

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