.Net 3.0 ile gelen en önemli yeniliklerden biridir. Diğer 3.0 yeniliklerinde olduğu gibi, temel geliş amacı LINQ mimarisini oluşturmaktır. Daha önceki yazılarımda static ve non-static kavramlarından bahsetmiştim. Kısaca tanımlamak gerekirse; sadece static class’lar içerisine yazılabilen ve nesneler üzerinde iş yapan static bir metodun, sanki o nesnenin non-static bir metoduymuş gibi çağırılabilen metotlardır. Normalde static metotlar nesne örnekleri üzerinden değil de, Tipadı.MetotAdı notasyonu ile kullanılabilirler. non-static metotlar ise, metodun tanımlandığı sınıfa ait bir nesne örneği üzerinden, nesneÖrneği.MetotAdı şeklinde kullanılabilir. Peki nasıl oluyor da, static olan bir metot, oluşturulan bir nesne örneği üzerinden çağırılabiliyor ?

C# 2.0 ile birlikte static anahtar sözcüğünü sınıflara uygulayabilmeye başlamıştık. Static sınıflar içerisine yazılan static metotlar, extension metot olarak kullanılabilirler. Bunun için yapmamız gereken tek şey, metodun hangi tipe ait nesne örneği üzerinden çıkmasını istiyorsak, parametre verirken “this” anahtar sözcüğünü kullanmamızdır. Bu özel bir parametredir. Dilerseniz örnek üzerinden devam edelim.

String tipleri üzerinde bazı işlemler yapmaya yarayacak birkaç metot yazmaya çalışalım. İlk metodumuz, üzerinden çağırıldığı string nesnesi içerisindeki nümerik ifadeleri temizleyen bir metot olsun. Bu metot parametre almasın ve geriye string bir değer döndürsün.

public static class MyExtensionClass

    {

        public static string NumerikleriTemizle(this string metin)

        {

            string result=string.Empty;

 

            foreach (char c in metin)

            {

                //gelen karakter nümerik değil ise ekle.

                if (!Char.IsNumber(c))

                {

                    result += c;

                }

            }

 

            return result;

        }

    }

Parametre olarak verilen ifade, metodun hangi tip nesne örnekleri üzerinde çıkacağını belirler. Artık tanımladığımız her string değişkeni üzerinde “NumerikleriTemizle” adlı metodu görebileceğiz.

image

Görüldüğü gibi, string tipinden tanımlanan bir nesne örneği üzerinden, static olan NumerikleriTemizle adlı metodu çağırabildik. Şimdi de metodumuzu test edelim.

class Program

    {

        static void Main(string[] args)

        {

            string kelime = "Deneme123";

 

            Console.WriteLine(kelime);

 

            string temizKelime = kelime.NumerikleriTemizle();

 

            Console.WriteLine(temizKelime);

           

        }

    }

Ekran çıktımız aşağıdaki gibi olacaktır.

image

NOT: Metodu yazmaya başlamadan önce parametre almayacağını söylemiştik. Ancak tasarım aşamasında “this string metin” şeklinde bir parametre verdiğimizi görüyoruz. this anahtar sözcüğü ile verdiğimiz bu özel parametre ile, metodun hangi tip üzerinden çağırılacağını belirleriz.

class Program

    {

        static void Main(string[] args)

        {

            int a = 5;

            a.BenHerYerdeCikarim("Int32");

 

            bool durum = false;

            durum.BenHerYerdeCikarim("boolean");

 

            Program p = new Program();

            p.BenHerYerdeCikarim("Program");

 

            SqlConnection conn = new SqlConnection();

            conn.BenHerYerdeCikarim("SqlConnection");

        }

    }

 

    public static class ExtensionTest

    {

        public static void BenHerYerdeCikarim(this object obj, string parametre)

        {

            Console.WriteLine("Ben object üzerinden çağırılabilen genişletilmiş bir metodum. '{0}' tipi üzerinden çağırıldım\n", parametre);

        }

 

    }

Ekran çıktısı aşağıdaki gibidir.

Untitled



4 yorum:

Adsız dedi ki...

...

Adsız dedi ki...

Süper

Adsız dedi ki...

Örneğin ve anlatımın çok iyi emeğine sağlık.

Unknown dedi ki...

Süper anlatım

Yorum Gönder