C# Generic Nedir? Generic Class ve Method

C# Generic Nedir?

Generic kelime anlamı olarak genel form anlamına gelir veya yani spesifik olmayan şeklinde de tanımlayabiliriz. C#’ta ise genel ve belirli bir veri türüne özgü olmayan anlamına gelir.

C# ile generic type parametresini kullanarak ve belirli bir veri türü olmadan generic sınıflar, interface’ler, abstract sınıflar, field’lar, method’lat, statik method’lar, property’ler, event’ler, delegate’ler ve operatörler tanımlamanıza olanak tanır.

Generic type, bir type adından sonra açılı ayraçlar (<>) içinde bir type parametresi belirtilerek bildirilir. Örneğin: TypeName<T> burada T bir generic type parametresidir.

C# Generic Class (Sınıf)

Genel sınıflar, sınıf adından sonra köşeli parantez içinde bir type parametresi kullanılarak tanımlanır. Örnek bir generic sınıf tanımı.

class DataStore<T>
{
    public T Data { get; set; }
}

Örneğimizde DataStore generic bir sınıftır. T ise DataStore sınıfının tipini temsil eder. Sınıfımızın sahip olduğu öğeler (field, property, metot parametreleri ve geri dönüş tipi, delegate) nesne oluşturma sırasında (instance) T parametresinin alacağı tipe bürünür.

Örneğimizde, Data genel bir özelliktir (property) ve tip olarak belirli veri tipi yerine generic tip parametresi T kullandık. Böylelikle özellik (property) nesne oluşturma sürecinde belirteceğimiz tipe bürünecektir.

Şimdi generic DataStore sınıfının bir nesnesini oluşturalım.

Instance Generic Sınıf

DataStore<string> store = new DataStore<string>();

Yukarıda ki örnekte nesne oluştururken string tipini köşeli parantez içinde belirttik. Bu nedenle, derleme zamanında sınıfta T parametresini kullanıldığımız her yerde (field, property, metot parametreleri ve geri dönüş tipi, delegate) T, string tipiyle değiştirilecektir.

Örneğimizde ise kullandığımız Data özelliği (property) string tipinde olacaktır.

O zaman artık data özelliğine bir string değer ataması gerçekleştirebiliriz.

DataStore<string> store = new DataStore<string>();
store.Data = "Hello World!";

Şimdi generic sınıfımıza fark tip atamaları atayalım.

DataStore<string> strStore = new DataStore<string>();
strStore.Data = "Hello World!";
//String tip ataması gerçekleştirdik.

DataStore<int> intStore = new DataStore<int>();
intStore.Data = 100;
//Int tip ataması gerçekleştirdik.

Generic Sınıf Özellikleri

  • Generic bir sınıf, yeniden kullanılabilirliği artırır.
  • Generic bir sınıf, diğer generic veya generic olmayan sınıflar veya abstract sınıflar için base sınıf olabilir.
  • Generic bir sınıf, diğer generic veya generic olmayan interface’lerden, sınıflardan veya abstract sınıflardan türetilebilir.

Generic Fields

Generic bir sınıf, generic fields (alanları) içerebilir. Ancak, başlatılamaz.

class DataStore<T>
{
    public T data;
}

Generic Array

class DataStore<T>
{
    public T[] data = new T[10];
}

Generic Method

class DataStore<T>
{    
    public void AddOrUpdate(int index, T item)
    {
        if(index >= 0 && index < 10)
            _data[index] = item;
    }

    public T GetData(int index)
    {
        if(index >= 0 && index < 10)
            return _data[index];
        else 
            return default(T);
    }
}

Yukarıda ki örneğimizde AddorUpdate() ve GetData() metotları generic metotlardır. AddOrUpdate metot generic bir parametreye, GetData() metodu ise generic bir geri dönüş tipine sahiptir.

Generic veri tipi T, DataStore<T> sınıfının nesneye dönüştürülmesi (instance) sırasında belirtilir. Böylece parametre ve geri dönüş tipi belirtilen tipe bürünür.

DataStore<string> sehirler = new DataStore<string>();
cities.AddOrUpdate(0, "Istanbul");
cities.AddOrUpdate(1, "Ankara");
cities.AddOrUpdate(2, "Rize");

DataStore<int> Plakalar = new DataStore<int>();
empIds.AddOrUpdate(0, 34);
empIds.AddOrUpdate(1, 06);
empIds.AddOrUpdate(2, 53);

Generic parametre tipi, generic olmayan parametreler ve dönüş tipi olan veya olmayan birden fazla parametre ile kullanılabilir.

public void AddOrUpdate(int index, T data) { }
public void AddOrUpdate(T data1, T data2) { }
public void AddOrUpdate<U>(T data1, U data2) { }
public void AddOrUpdate(T data) { }

Generic olmayan bir sınıf içinde generic metotlarda tanımlanabilir.

public class Program
{
	public static void Main()
	{
		Printer printer = new Printer();
		printer.Print<int>(100);
		printer.Print(200);

		printer.Print<string>("Hello");
		printer.Print("World!");
	}
}

class Printer
{
    public void Print<T>(T data)
    {
        Console.WriteLine(data);
    }
}

Multiple Generic Parametre

Virgülle ayrılmış birden çok generic tip parametresi tanımlayabilirsiniz.

class KeyValuePair<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}

NOT:

Generic yapılarda genellikle T parametre kullanılır ama bu zorunlu değildir. T yerine herhangi bir isim verebilirsiniz.