Generic’ler
C#’ta Generic’ler, farklı veri tipleriyle çalışabilen ve tür güvenliğini koruyan sınıflar, metotlar ve yapıların oluşturulmasını sağlayan güçlü bir özelliktir. Generic’ler, kodun yeniden kullanılabilirliğini artırır, tip dönüşümlerinden kaynaklanan hataları önler ve performansın korunmasını sağlar. Özellikle List
Generic’ler, bir sınıfın veya metodun hangi veri tipi ile çalışacağını belirlemeden tanımlanmasını sağlar ve tip bağımsız esnek bir yapı sunar. Bu özellik, yazılım mimarisinde modüler ve sürdürülebilir kod yazmayı kolaylaştırır. Generic’ler aynı zamanda OOP (nesne yönelimli programlama) prensipleri ile uyumludur ve polimorfizm, encapsulation ve abstraction gibi kavramları destekler.
Bu eğitimde okuyucu, Generic sınıf ve metodların tanımını, type constraints kullanmayı, koleksiyonlar ile entegrasyonunu ve gerçek dünya senaryolarında nasıl uygulanacağını öğrenecektir. Ayrıca, performans optimizasyonu, hata yönetimi ve yaygın tuzaklardan kaçınma gibi ileri düzey konular da ele alınacaktır.
Temel Örnek
textusing System;
namespace GenericDemo
{
// Generic sınıf tanımı
public class Kutu<T>
{
private T icerik;
public void Ekle(T item)
{
icerik = item;
}
public T Al()
{
return icerik;
}
}
class Program
{
static void Main(string[] args)
{
// int tipi ile Generic kullanım
Kutu<int> intKutu = new Kutu<int>();
intKutu.Ekle(100);
Console.WriteLine("Kutu içeriği: " + intKutu.Al());
// string tipi ile Generic kullanım
Kutu<string> stringKutu = new Kutu<string>();
stringKutu.Ekle("Merhaba C#");
Console.WriteLine("Kutu içeriği: " + stringKutu.Al());
}
}
}
Bu temel örnekte, Kutu
Generic kullanımı, OOP prensipleri ile uyumludur ve sürdürülebilir, okunabilir, modüler kod geliştirilmesini destekler. Bu yapı, gerçek dünya uygulamalarında veri güvenliği ve kod performansı açısından kritik bir avantaj sunar.
Pratik Örnek
textusing System;
using System.Collections.Generic;
namespace AdvancedGenericDemo
{
// Generic repository sınıfı
public class Repository<T> where T : class
{
private List<T> items = new List<T>();
public void Ekle(T item)
{
if (item == null)
throw new ArgumentNullException(nameof(item), "Eleman null olamaz");
items.Add(item);
}
public T Ara(Predicate<T> kosul)
{
return items.Find(kosul);
}
public void HepsiniGoster()
{
foreach (var item in items)
{
Console.WriteLine(item.ToString());
}
}
}
class Urun
{
public string Ad { get; set; }
public decimal Fiyat { get; set; }
public override string ToString()
{
return $"{Ad} - {Fiyat} TL";
}
}
class Program
{
static void Main(string[] args)
{
Repository<Urun> urunRepo = new Repository<Urun>();
urunRepo.Ekle(new Urun { Ad = "Laptop", Fiyat = 15000 });
urunRepo.Ekle(new Urun { Ad = "Telefon", Fiyat = 8000 });
Console.WriteLine("Tüm ürünler:");
urunRepo.HepsiniGoster();
Urun pahaliUrun = urunRepo.Ara(u => u.Fiyat > 10000);
Console.WriteLine("Pahalı ürün: " + pahaliUrun);
}
}
}
Bu ileri düzey örnekte, Repositorywhere T : class
constraint kullanılarak yalnızca referans tiplerin kullanılması sağlanmıştır. Ekle metodu, null kontrolü ile güvenli veri ekler. Ara metodu Predicate
Bu örnek, Generic’lerin OOP prensipleri, hata yönetimi ve algoritmalarla birlikte kullanımı için ideal bir senaryodur. Ayrıca, performans ve tip güvenliği açısından C#’ta en iyi uygulamaları göstermektedir.
Generic’ler için C# en iyi uygulamalar ve yaygın hatalar:
- Type constraints kullanarak tip güvenliğini sağlamak
- Generic koleksiyonları (List
, Dictionary\ ) tercih etmek - Null değer ve hata yönetimini doğru şekilde uygulamak
- Fazla genellemeden kaçınarak kod karmaşıklığını önlemek
- Boxing/unboxing işlemlerinden kaçınmak ve performansı optimize etmek
- Bellek sızıntılarını önlemek için unmanaged kaynakları doğrudan saklamamak
- Debugging sırasında gerçek tipleri kontrol etmek
- Veri bütünlüğünü sağlamak ve girişleri doğrulamak
📊 Referans Tablosu
C# Element/Concept | Description | Usage Example |
---|---|---|
Generic Sınıf | Farklı tiplerle çalışabilen sınıf | public class Kutu<T> { T icerik; } |
Generic Metod | Farklı tiplerle çalışabilen metot | public T Al<T>(T item) { return item; } |
Constraints | Tip sınırlamaları | where T : class, new() |
List<T> | Generic liste | List<int> sayilar = new List<int>(); |
Dictionary\<TKey,TValue> | Anahtar-değer koleksiyonu | Dictionary\<string,int> yaslar = new Dictionary\<string,int>(); |
Predicate<T> | Koşullu arama ve filtreleme | items.Find(u => u.Fiyat > 10000); |
Özet ve sonraki adımlar:
Generic’ler, C#’ta güvenli, tekrar kullanılabilir ve performanslı kod yazmayı sağlar. Generic sınıflar, metodlar, type constraints ve tasarım desenleri ile modüler mimariler oluşturabilirsiniz. Gelecekte Stack
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu konudaki anlayışınızı pratik sorularla test edin.
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek