Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Yazılım Makaleleri

0

C# Genişletme Yöntemleri (Extension Methods)

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.


Yazan: 09.04.16 17:01

101,387p 4ü