Uzatım Metodları Extension Methods

C# dili 3.0 ile lambda fonsiyonları, LINQ, ve 3.5 versiyonuyla beraber anonim tipler gibi yeniliklerin yanında uzatım metotlarını da duyurdu. Bu yazımızda dilimiz döndüğünce bu metotları sizlere anlatmaya çalışacağım.

Adından da anlaşılacağı üzerine bu metotlar mevcut tiplere (sınıflara) ilave olarak onların işlevlerini uzatan, genişleten metotlar diyebiliriz. Eğer siz bir sınıf geliştirmiş ve bunu bileşen olarak internet üzerinden insanların indirip uygulamalarında kullanmasını istiyorsanız bu bileşenin yanında dokümantasyonun da vermeniz gerekir. Böylece bileşeni kullanmak isteyen kişiler dokümantasyondan faydalanarak sınıfınızı kullanmaya başlayabilirler. Peki bu uzatım metotları olayın neresinde? Henüz bir yerinde değil aslında. Bu yöntemle yazmış olduğunuz bileşen içindeki metotların diğer .NET tiplerinin bir uzantısı olarak görünmesini sağlayabiliyorsunuz. Yani mevcut tiplerin özelliklerini genişletebiliyorsunuz. İçinizden “Ne var bunda. Zaten o tipleri miras yoluyla da alıp mevcut metotları geliştiremiyor muyuz?” diye sorduğunuzu duyar gibiyim. Evet izin verilmiş taban sınıftaki metotları ezerek (override) kendi işlevselliğinizi geliştirebilirsiniz tabi ki. Ama bizim bahsettiğimiz. Mevcut bir tipi miras yoluyla yeni bir tipe alarak onun üstüne ilaveler yapmak değil. Tekrar ediyorum: Amacımız mevcut tiplere ilave metotlar yazmak. Örneğin kişi string tipinde bir değişken tanımlandığında değişken adından sonra nokta diyerek nesnenin üyelerine baktığında orada sizin ilave etmiş olduğunuz metodu görebilecek ve kullanabilecektir… Bu yöntemin bir diğer faydası da sizin bileşeninizi kullanan kişilerin yeni bir tipi ve özelliklerini öğrenmeye, onun kopyalarını oluşturmaya gerek duymadan mevcut tipleri ile yeni metotlarınızı kullanmaya başlayacak olmalarıdır.

Çok laf ettik değil mi? Az laf çok iş diyelim. Olayı netleştirmek için bir örnek üzerinde açıklayalım. Diyelim ki bir proje üzerinde çalışıyoruz. Bu projede girilen metinler içindeki boşlukların yerine “-” koymamız gereksin. Normal şartlarda ya yeni bir class içine ya mevcut classlar içine istenen işi yapan bir metot ilave ederiz.

public class StringMetodlarim
{
    public static string MyFilter(string TextToFilter)
    {
        return TextToFilter.Replace(" ", "-");
    }
}

Yazılan bu metodu uygulamamızda (Bu örneğimiz için bir console uygulaması olsun) kullanmak için şuna benzer satırlar yazabiliriz:

    classProgram
    {
        static void Main(string[] args)
        {
            string myString = "Ozan Kutlu BAYRAM";
            Console.WriteLine(StringMetodlarim.MyFilter(myString));
        }
    }
 

Uygulamayı çalıştırdığımızda ekran üzerinde şöyle bir çıktı görünür:

Ozan-Kutlu-BAYRAM

Press any key to continue . . .

Not: Yazılan yeni sınıfın Program sınıfı ile aynı isim alanında (namespace) olduğunu unutmayın. Farklı bir isim alanı içinde bu sınıfı tanımladınız ise sınıfı, Program sınıfından kullanabilmek için tanımladığınız isim alanını using direktifi ile tanıtın ya da açık yazım ile sınıfı kullanın (isimalani.sinifismi şeklinde) Şimdiye kadar yaptıklarımızı eskiden beri yaptığımız şeylerle aynıydı. Peki ya ben tanımladığım string değişkeni yazdığımın sınıfın metoduna parametre olarak geçirmek yerine “myString.MyFilter()” diyebilsem iyi olmaz mı? Evet diyorsanız işte uzatım metotlarının oyuna girdiği yer tam da burası. Yazdığını MyFilter metodunu string tipine ilave olarak eklemek için onu uzatım metodu olarak tanımlamamız gerekecek. Bu metodu da ayrı bir sınıf içinde yazalım.

    public static class MyExtensions
    {
        public static string MyFilter(this string TextToFilter)
        {
            return TextToFilter.Replace(" ", "-");
        }
    }

 

Bu metoda baktığımızda diğer metottan tek farkının parametresinden önce aldığı this kelimesinin olduğunu farketmişsinizdir. İşte bu metodu uzatım metodu yapan sadece bu tek kelime… İşin geri kalanını bizim için C# derleyicisi hallediyor. Artık uygulamamız içinde ne zaman bir string tipinde değişken yaratsak yanında nokta ile başladığımızda bu uzatım metodunun da listelendiğini görebiliriz… Bu metodu mevcut örneğimizde kullanmak için tek yapmamız gereken:

    class Program
    {
        static void Main(string[] args)
        {
            string myString = "Ozan Kutlu BAYRAM";
            Console.WriteLine(StringMetodlarim.MyFilter(myString));
            Console.WriteLine(myString.MyFilter());
        }
    }

 

Klavyeleriniz şen ola.

Kodun tamamı:

using System;
using System.Collections.Generic;
using System.Text;

namespace ExtensionMethods
{
    class Program
    {
        static void Main(string[] args)
        {
            string myString = "Ozan Kutlu BAYRAM";
            Console.WriteLine(StringMetodlarim.MyFilter(myString));
            Console.WriteLine(myString.MyFilter());
        }
    }

    public static class MyExtensions
    {
        public static string MyFilter(this string TextToFilter)
        {
            return TextToFilter.Replace(" ", "-");
        }
    }

    public class StringMetodlarim
    {
        public static string MyFilter(string TextToFilter)
        {
            return TextToFilter.Replace(" ", "-");
        }
    }
}

 

Yazı oluşturuldu 141

Bir yanıt yazın

Benzer yazılar

Aramak istediğinizi üstte yazmaya başlayın ve aramak için enter tuşuna basın. İptal için ESC tuşuna basın.

Üste dön