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:
1public class Repository<T>2{3public void PrintType()4{5Console.WriteLine(typeof(T)); // Bu çalışır6}78public T CreateInstance()9{10return (T)Activator.CreateInstance(typeof(T)); // Hata: T'nin parametresiz constructor'ı olmayabilir11}12}Doğru Yöntem:
1public class Repository<T> where T: new()2{3public T CreateInstance()4{5return new T(); // Constraint ile güvenli6}7}89var repo = new Repository<string>(); // Hata: string'in new() constructor'ı yokConstraint olmadan generic method'a yanlış tip gönderebilirsin. Özellikle interface veya base class gerektiğinde sorun çıkar.
1// Hatalı: hiçbir constraint yok2public void SaveData<T>(T data)3{4data.ToString(); // Çalışır, ama T'nin ToString'i override etmiş olup olmadığı bilinmiyor5}67// Doğru: IEntity constraint'i8public void SaveData<T>(T data) where T: IEntity9{10db.Add(data);11db.SaveChanges();12}1314public interface IEntity15{16int Id { get; set; }17}Value type'ları object olarak geçirirsen boxing meydana gelir. Generic kullanmak bunu önler.
1// Yanlış: Boxing sorunu2List<object> numbers = new List<object>();3numbers.Add(5); // Boxing4int value = (int)numbers[0]; // Unboxing56// Doğru: Generic kullan7List<int> numbers = new List<int>();8numbers.Add(5); // Boxing yok9int value = numbers[0];1// Covariance hatası2List<string> strings = new List<string>();3List<object> objects = strings; // Hata: List<T> covariant değil45// Doğru: IEnumerable<T> covariant6IEnumerable<string> enumStrings = new List<string>();7IEnumerable<object> enumObjects = enumStrings; // Çalışır1public T Parse<T>(string value) where T: struct2{3return (T)Convert.ChangeType(value, typeof(T));4}56// Hata: T'yi tahmin edemez7var result = Parse("42");89// Doğru: Açıkça belirt10var result = Parse<int>("42");11Console.WriteLine(result); // 42Generic 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ı.
0 yorum