C# Generic New Constraint
Bu yazımda C#’ta Generic New Constraint’ten bahsedeceğim.
class Gen<T> { T t1; public Gen() { this.t1 = new T(); } }
Yukarıdaki kod bloğunu Visual Studio derleyicisine geçirip, derledikten sonra hatayla karşılaşacaksınız.
Zaten derleyici ” new T(); ” komutunun altınıda kırmızıyla çizecektir.Bu hatanın sebebi nedir?İşte bu sorunun çözümüne Generic New Constraint deniyor.
Eğer T için bu Generic class içinde bir nesne yaratıp bağlamak istiyorsak, new kelimesi ile nesne oluşturmasına default olarak izin verilmez.Bu izni sağlamak için ” where T : new() ” ifadesini class tanımına eklemeliyiz.
Şimdi bu ” new T(); ” kodunda hata vermesinin sebebini sorgulayalım..
Biliyoruzki T parametresi dışardan alacağı değere göre bir tip olacaktır.Örn;Benim elimde Araba.cs sınıfı olsun ve ben bu Araba sınıfına bir parametre alan constructor yazıyım.Doğal olarak boş constructor eziliyor.Yani Araba sınıfından nesne oluştururken new Araba() diyip oluşturamayacağım.Çünkü Araba sınıfında parametre alan constructor mevcuttur.Default boş constructorı bu parametre alan constructor ezmektedir.Bende elimle boş constructor yazmadığım için “new Araba()” şeklinde nesne oluşturamayacağım.İşte bu tarzdaki Araba sınıfımı T ye verirsem eğer, “new T() -> new Araba()” olacaktır.İşte bu olası durumdan kaçınmak için, .NET tarafından bu durumun önlemi alınmıştır.
class Gen<T> where T:new() { T t1; public Gen() { this.t1 = new T(); } }
Artık kodumuzu yukarıdaki gibi düzeltirsek, yani class imzasına “where T:new()” kodunu eklersek program hata vermeyecektir.
Şunlarıda söylemek isterim.
Bir Generic class içinde birden fazla constraint aynı anda bildirilebilir.Yani hem Base class, hem de new constrainti olabilir.
class Gen<T> where T:Araba where T:new() { }
Yukarıda gördüğünüz gibi, birden fazla constraint yazılacaksa, new constraint en sonra olmalıdır.
Bu yazımında sonuna gelmiş olduk.Bir sonraki yazımda görüşmek üzere..
İyi çalışmalar