Recep SELLİ - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Makalelerim | Videolarim | RSS RSS | İletişim
İçerik Kategorileri
Anket
Web Projelerinde Hangi Teknolojiyi Kullanıyorsunuz ?

E-mail Adresini Ekle


  •              
Tema
Kaynaklar
Takip Ettiklerim

Extension Metotlar


Herkese merhabalar ben Recep SELLİ bu makalemizde sizlerle extension metotları inceliyor olacağız. Bu metotlar nelerdir nasıl kullanılırlar gibi sorulara hep birlikte cevaplar arayacağız.
 
Extension metotlar yani Türkçe karşılığı ile Genişletme Metotları .Net framework 3.5 ile birlikte gelen yeniliklerden bir tanesidir.
Bu metotların temel amacı genişletilemeyen tiplere yeni özellikler kazandırmaktır.Örnek vermek gerekirse .Net içerisinde kullandığımız değişken türleri, DataSet, DataTable vb. nesneleri, diziler ve koleksiyonlardır.Bu tür metotlar uygulandıkları tipin yapısına hiçbir zarar vermeden onun bir parçası gibi davranırlar ve o tipe ek özellikler kazandırırlar.Extension metotların yazımında ise belli üç ana temel kural vardır.Bu metotlar kesinlikle static bir class içerisinde static olarak tanımlanmış olmalılar ve ilk parametreleri this anahtar sözcüğü ile başlamalıdır. Şimdi isterseniz hemen ilk örneğimizi geliştirelim ve extension metotları anlamaya çalışalım. Ben bir console uygulaması açıyorum ve kodlarımızı yazmaya başlıyorum. İlk önce Genişletme metodumuz olan Int32’yı yazalım bu metodumuz dışarıdan girilen değer eğer bir sayısı ise true değil ise false değer döndürecek.
public static class Extension_Metotlar
{
   public static bool Int32(this string Deger)
   {
           int Sayi;
           bool Gecerli = int.TryParse(Deger, out Sayi);
           if (Gecerli)
           {
               return true;
           }
           else
           {
               return false;
           }
   }
}
Yukarıdaki classımızda yaptıklarımıza bakacak olursak eğer class’ımızın static olarak tanımlandığını görürüz. Bu bizim extension metotlar tanımlamak için ilk kurala uyduğumuzu gösterir. Hemen alt satırında yazılan metodumuzun yine static olarak tanımladığını görüyoruz bu ikinci kuralıda yerine getirmişiz demektir.Int32 adlı metodumuzun bir tek parametre alıyor ve bu parametreye this anahtar sözcüğü ile başladık bu da bizim extension metotlar için uymamız gereken bütün kurallara uyduğumuzu gösteriyor. 
Extension metotlara istediğimiz kadar parametre ekleyebiliriz fakat unutulmaması gereken tek şey sadece ilk parametrenin this anahtar sözcüğü ile başlaması gerektiğidir bunun başlıca sebebi this anahtar sözcüğünden sonra gelen türe bu metodun uygulanacak olmasıdır diğer parametreler için ise this anahtar sözcüğünü kullanılmaz. Metodumuza kısaca bakacak olursak geriye boolean tipinde bir değer döndürmekte bunu dışarıdan girilen değerin integer tipinde olup olmamasına göre belirlemektedir. Şimdi yukarıda yazdığımız metodumuzu kullanma zamanı geldi arkadaşlar projemizin ana metoduna şunları yazalım.
class Program
{
    static void Main(string[] args)
    {
        Console.Write("Lütfen Birşeyler Giriniz : ");
        string Deger = Console.ReadLine();
        bool Gecerli;
        Gecerli = Deger.Int32();
        if (Gecerli)
        {
            Console.WriteLine("Girilen bir sayıdır...! ");
        }
        else
        {
            Console.WriteLine("Girilen bir sayı değildir...! ");
        }
        Console.ReadLine();
    }
}
Altını çizdiğim kırmızı renkli satır string tipine yeni bir metot olarak eklenecektir ve diğer bütün string değişkenlerimizde de bu metodumuzu gözükecektir. Aynı zamanda kullanırken visual studio 2008 bizim extension metodumuza intellisense desteğide vermekte.

 

Birden fazla aynı isimde metotlarımız olabilir buna overloading (aşırı yüklenme) denir. Extension metotlar içinde overloading işlemini gerçekleştirebiliriz. Overloading olarak hazırlanmış metotları birbirinden ayırt eden kriterler metot içerisinde yer alan parametre tipleri ve parametre sayılarıdır. Hemen bir örnek yapalım.
public static class Extension_Metotlar
{
    public static bool Int32(this string Deger)
    {
        int Sayi;
        bool Gecerli = int.TryParse(Deger, out Sayi);
        if (Gecerli)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public static bool Int32(this string Deger, int Sayi)
    {
        bool Gecerli = int.TryParse(Deger, out Sayi);
        if (Gecerli)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}
Yukarıda yazdığımız koda görüldüğü gibi Int32 isimli metodumuz overloading işlemine tabi tutulmuş.Artık bu metodumuzun iki kullanımı mevcut.Peki derleyici bizim hangi metodu kullandığımızı nasıl anlayacak ? bu sorunun cevabı oldukca basittir.Tabiki 2 metodunda parametre sayısı farklıdır bizim dışarıdan girdiğimiz parametreye göre doğru olanın hangisi olacağına kendisi karar verecektir.
 
 

Gördüğünüz gibi extension metotları çok rahat bir şekilde overloading yapabiliriz. Bu durumda hemen aklımıza şu soru gelebilir. String türüne ait olan herhangi bir metodu da overloading yapabilir miyiz? Bu sorumuza verilecek cevap tabiî ki de evet olacaktır. Peki, string türüne ait bir metodunun aynısını yazarak onu ezebilir (ovverride) miyiz? Gelin şimdi bunu bir inceleyelim, örneğin String tipinin Contains metodunu deneyerek bakalım. Bu metodumuz geriye boolean tipinde bir değer döndürmekte ve parametre olarak da string tipinde tek bir parametre almakta.
public static bool Contains(this string text)
{
  return false;
}
Yukarıda bizim yazdığımız metodumuz ile Contains metodunu ovverride etmeyi planlıyoruz. Bakalım derleyici hangisini kullanmamıza izin verecek ?
 
 

Resimde de gördüğünüz gibi nesnelerin orijinal metotları extension metotlarla ezilemezler.Projemizi çalıştırmaya kalktığımızda ise herhangi bir hata ile karşılaşmayız, derleyici orijinal metodu ezmediği gibi genişletme metodumuzu da saf dışı bırakmıştır. Extension metotlar dil bağımlı değildirler.Yani Csharp kullanarak tasarladığımız extension metodlarımızı hiçbir sıkıntı çekmeden vb.net içerisinde de kullanabiliriz.(tam tersi durumda geçerlidir.) Yapmamız gereken tek şey hazırlamış olduğumuz extension metodlarımızı dll haline getirip diğer dilde hazırladığımız projeye referans etmektir.Yukarıda yazdığımız extension metotlarımızı ben dll haline getirdim ve vb.net projemizde referans kısmına ekledim.Şimdi tek yapmam gereken şey bu dll içinde yer alan metotlarımızı kullanmak.

 

En tepede eklediğimiz ExtensionMetotlar adlı dll’imiz görüyoruz ve altdaki resimde de bu dll içerisinde bulunan metotlarımızı nasıl kullandığımızı.

 

Bir makalemizin daha sonuna geldik arkadaşlar ben Recep SELLİ bu makalemizde sizlerle birlikte csharp 3.0 ile extension metotların kullanımlarını incelemeye çalıştık.Herkese bol kodlamalar.

Kaynakça: Derinlemesine Extension Methods Burak Selim ŞENYURT

Yazılım 10.01.2009 06:17:04

YORUM YOK


YorumlarYorum Yaz
Ana Sayfa | Hakkımda | Makalelerim | Videolarim | RSS | İletişim