Genişletme yöntemleri, asıl tipi değiştirmeden, kalıtımla yeni bir tip oluşturmadan ve ayrıca derlemeye gerek kalmadan var olan tiplere yeni yöntemler eklemenizi sağlar. Örneğin
Stringtipine KelimeSayisi veya KarakterSayisi gibi bir karakterin String içinde kaç tane bulunduğunu döndüren bir yöntem ekleyebilirsiniz. Tipin orijinal yöntemleri ile genişletme yöntemlerini çağırmak arasında bir fark yoktur.
using System;
namespace GenisletmeYontemleri
{
public static class GenisletmeYontemlerim
{
public static int KarakterSayisi(this String str, Char c)
{
if (str == String.Empty) return 0;
return str.Split(new Char[] { c }).Length - 1;
}
public static int KelimeSayisi(this String str)
{
return str.Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
class Program
{
static void Main(string[] args)
{
String m = "Kara kara kartallar, karlı iyi tarlalar ararlar";
Char aranan = 'a';
Console.Write("'{0}' harfi sayısı : ", aranan);
Console.WriteLine(m.KarakterSayisi(aranan));
Console.Write("Kelime sayısı : ");
Console.WriteLine(m.KelimeSayisi());
Console.ReadKey();
}
}
}
Kodun çıktısı şöyle olacaktır:
'a' harfi sayısı : 14
Kelime sayısı : 7
Örnekte görüldüğü gibi GenisletmeYontemlerim isimli bir statik sınıf içinde tanımlanan iki statik yöntemin ilk parametreleri normal
String str şeklinde bir tanımlama yerine
this String str şeklinde tanımlanmıştır. Buradaki
this ifadesi ile ifadenin yanındaki parametrenin tipine (örneğimizde
String tipine), geçerli yöntemi sınıfın / tipin kendi metodları gibi kullanılacak yeni bir yöntem olarak ekler.
Burada String tipine eklenen eklenen "
KarakterSayisi" ve "
KelimeSayisi" yöntemlerinin ana program içindeki kullanımlarına bakıldığında String türündeki "
m" isimli değişkende aynen
String'in diğer metodları (örneğin
IndexOf,
EndsWith) gibi kullanıldığı görülür. Ayrıca bir başka dikkat çeken konu ise yönteme gönderilen parametre sayısıdır. Genişletme yöntemlerinde 1. parametre olarak genişletilen tipin kendisi kullanıldığından,
KarakterSayisiyöntemi 2, KelimeSayisi yöntemi 1 parametre ile tanımlanmasına rağmen
KarakterSayisi yöntemi sadece 2. parametre kullanılarak, KelimeSayisi ise hiç parametre kullanılmadan çağrılmıştır.
Genişletme Yöntemleri, Visual Studio içinde aynen diğer yöntem ve özelliklerde olduğu gibi IntelliSense listesinde (çoğunlukla bir sınıf örneği adı yazıldıktan sonra . karakterine basılırsa görülen özellik ve yöntemler listesi) de görülür.
.NET Framework Sınıf Kütüphanesinde de genişletme yöntemleri bulunur. Örneğin, özellikle LINQ sorgularında işe yarayan
IEnumerable arayüzünün aslında sadece 1 tane (
GetEnumerator) yöntemi bulunduğu halde IntelliSense listesinde bir çok yöntemi olduğunu görürsünüz. Bu yöntemler
System.Linq isim alanında tanımlanmış olan
IEnumerableve
IEnumerable<T> arayüzlerinin genişletme yöntemleridir.
Son olarak şunu ekleyelim. Genişletme yöntemleri jenerik olmayan (generics) statik bir sınıf oluşturulup bu sınıfın içinde tanımlanmalıdır.