C# Generics Kullanırken Yapılan Yaygın Hatalar

# C# Generics Kullanırken Yapılan Yaygın Hatalar

Generics, C#'ta type-safe koleksiyonlar ve yeniden kullanılabilir kod yazmayı sağlar. Ancak yanlış kullanıldığında beklenmedik sorunlara yol açar. Burada en sık yapılan hataları somut örneklerle görelim.

C# runtime'da generic type bilgisini kaybeder. Bu yüzden `typeof(T)` ile tip kontrolü yapamaz, casting işlemleri riskli olur.

Yanlış Kullanım:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1public class Repository<T>
2{
3public void PrintType()
4{
5Console.WriteLine(typeof(T)); // Bu çalışır
6}
7
8public T CreateInstance()
9{
10return (T)Activator.CreateInstance(typeof(T)); // Hata: T'nin parametresiz constructor'ı olmayabilir
11}
12}

Doğru Yöntem:

1public class Repository<T> where T: new()
2{
3public T CreateInstance()
4{
5return new T(); // Constraint ile güvenli
6}
7}
8
9var repo = new Repository<string>(); // Hata: string'in new() constructor'ı yok

Constraint olmadan generic method'a yanlış tip gönderebilirsin. Özellikle interface veya base class gerektiğinde sorun çıkar.

1// Hatalı: hiçbir constraint yok
2public void SaveData<T>(T data)
3{
4data.ToString(); // Çalışır, ama T'nin ToString'i override etmiş olup olmadığı bilinmiyor
5}
6
7// Doğru: IEntity constraint'i
8public void SaveData<T>(T data) where T: IEntity
9{
10db.Add(data);
11db.SaveChanges();
12}
13
14public interface IEntity
15{
16int Id { get; set; }
17}

Value type'ları object olarak geçirirsen boxing meydana gelir. Generic kullanmak bunu önler.

1// Yanlış: Boxing sorunu
2List<object> numbers = new List<object>();
3numbers.Add(5); // Boxing
4int value = (int)numbers[0]; // Unboxing
5
6// Doğru: Generic kullan
7List<int> numbers = new List<int>();
8numbers.Add(5); // Boxing yok
9int value = numbers[0];
1// Covariance hatası
2List<string> strings = new List<string>();
3List<object> objects = strings; // Hata: List<T> covariant değil
4
5// Doğru: IEnumerable<T> covariant
6IEnumerable<string> enumStrings = new List<string>();
7IEnumerable<object> enumObjects = enumStrings; // Çalışır
1public T Parse<T>(string value) where T: struct
2{
3return (T)Convert.ChangeType(value, typeof(T));
4}
5
6// Hata: T'yi tahmin edemez
7var result = Parse("42");
8
9// Doğru: Açıkça belirt
10var result = Parse<int>("42");
11Console.WriteLine(result); // 42

Generic kullanırken constraint ekle, type erasure'dan haberdar ol, boxing'i önle ve covariance kurallarını anla. Bu basit kuralları izlemek, type-safe ve performanslı kod yazmanın anahtarı.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz