| « Asal Sayılar | Source Control » |
Generics Üzerine
Bir süredir demo yazma işleri ile uğraştığımdan bişeyler yazma fırsatım pek olmuyor. Forum’larda gezerken bu konulara yabancı kişiler gördüğüm için Generics ile ilgili bişeyler anlatayım dedim.
Generics C++’da bulunan Template mevzularının daha gelişmiş halidir. Bu teknoloji daha az kod yazmamıza yarıyor birde c#’daki boxing olaylarını azaltıyor.
Framework 2.0′da gelen List class’ı mesela generics destekli bir ArrayList’dir. 1.1 ve öncesinde mesela;
ArrayList hayvanlar = new ArrayList();
list.Add("kedi");
list.Add("köpek");
string hayvan = (string)list[0];
şeklinde kullanılıyordu. Bu iş yapılırken arka tarafda eklediğiniz hayvan isimleri liste içerisine box edilerek object halleri ekleniyor. Listeden geri alırkende doğal olarak string’e geri çevirmek gerekiyor.
ArrayList’in yeni Generics destekli halinde;
List<string> list = new List<string>();
list.Add("kedi");
list.Add("köpek");
string hayvan = list[0];
şeklinde kullanılıyor. Generics nedeniyle Add metodu object değil sadece string değerleri kabul edecektir.
Bu şekilde kullanımlarda Type parameteresi genellikle “T” şeklinde gösterilir.
Collection’lar üstündeki generics kullanımı sadece tek bir konudur. asıl generics kullanımı delegate’ler ile daha zevkli. mesela;
public static class FilterHelper
{
public static IEnumerable<T> Filter<T>( IEnumerable<T> liste , Predicate<T> match )
{
foreach(T item in liste)
{
if ( match(item) )
yield return item;
}
}
}
void main()
{
List<int> sayilar = new List<int>;
sayilar.Add(5);
sayilar.Add(25);
sayilar.Add(325);
private bool IsFiltered(int sayi)
{
return sayi > 10;
}
foreach( int sayi in FilterHelper.Filter<int>( sayilar, IsFiltered ) )
Console.WriteLine( sayi );
}
bu ne iş yapar ?
Önce;
* IEnumerable<T> : T tipindeki foreach yapılabilen herhangi bişeydir. Array, List vs..
* Predicate<T> : T tipinde bir delegedir. Framework 2.0 da System altında tanımlıdır. T tipinde bir obje alan ve bool döndüren bir delege fonksiyonu tanımlar.
* yield return : Yeni bir liste vs oluşturmadan enumerasyon yapmanızı sağlar.
sonuç olaraktan ekrana 25 ve 325 sayılarını basacaktır.
FilterHelper şeklindeki metodlarla yazdığınız algoritmalar için veri tipinden bağımsız olarak tekrar kullanma imkanı olacaktır.