C# dili 3.0 ile lambda fonsiyonları, LINQ, ve 3.5 versiyonuyla beraber anonim tipler gibi yeniliklerin yanında uzatım metodlarını da duyurdu. Bu yazımızda dilimiz döndüğünce bu metodları sizlere anlatmaya çalışacağım..
Adından da anlaşılacağı üzerine bu metolar mevcut tiplere (sınıflara) ilave olarak onların işlevlerini uzatan, genişleten metodlar diyebiliriz.
Eğer siz bir sınıf geliştirmiş ve bunu bileşen olarak internet üzerinden insaları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 metodları olayın neresinde? Henüz bir yerinde değil aslında...
Bu yöntemle yazmış olduğunuz bileşen içindeki metodları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 yoluylaya alıp mevcut metodları geliştiremiyor muyuz?" diye sorduğunuzu duyar gibiyim... Evet izin verilmiş taban sınıftaki metodları 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 metodlar 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 metodları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 metod 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:
class Program
{
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 metodları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 metoduda 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 metoddan 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(myString.MyFilter());
}
}
Klavyeleriniz şen ola...
Tüm Uygulama
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace ExtensionMethods
6 {
7 class Program
8 {
9 static void Main(string[] args)
10 {
11 string myString = "Ozan Kutlu BAYRAM";
12 Console.WriteLine(StringMetodlarim.MyFilter(myString));
13 Console.WriteLine(myString.MyFilter());
14 }
15 }
16
17 public static class MyExtensions
18 {
19 public static string MyFilter(this string TextToFilter)
20 {
21 return TextToFilter.Replace(" ", "-");
22 }
23 }
24
25 public class StringMetodlarim
26 {
27 public static string MyFilter(string TextToFilter)
28 {
29 return TextToFilter.Replace(" ", "-");
30 }
31 }
32 }
Bu yazıyı ilk değerlendiren siz olun
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5