Tür kısıtları
where ile türe, yapıya ve new() kısıtları koymayı öğrenirsin.
where ile tür kısıtı
Bazen generic tür parametresinin ne tür olabileceğini sınırlamak isteyeceksin. where yan tümcesi bunun içindir. class Factory<T> where T : new() yazısı, T'nin parametresiz yapıcı metoda sahip olması gerektiğini söyler.
Başka kısıtlar: where T : class (başvuru türü), where T : struct (değer türü), where T : IComparable<T> (belirli arayüz). Kısıt koyduğunda derleyici, kısıtın sağladığı özellikleri kullanmana izin verir. Örneğin new() kısıtı ile new T() yazabilirsin.
new() kısıtı ile örnek üretmek
new() kısıtı, generic sınıf içinde new T() yazarak yeni bir T örneği üretmene izin verir. Bu, bir factory (üretici) desenini uygulamak için çok kullanışlıdır.
Örnek: class Factory<T> where T : new() { public T Create() { return new T(); } }. Bu sınıf, herhangi bir parametresiz yapıcıya sahip türden yeni örnek üretir. Kısıt olmadan new T() yazamazdın; derleyici T'nin yapıcıya sahip olup olmadığını bilemezdi.
Uygulama Factory<T> ile örnek üret
Factory<T> generic sınıfını tanımla; where T : new() kısıtı ekle. İçinde public T Create() metodu return new T(); yapsın. Widget sınıfı tanımla; public string Name { get; set; } = "Merhaba"; olsun. Main içinde Factory<Widget> örneği üret, Create çağır ve Name'i yazdır.
Örnek çözümü göster
class Factory<T> where T : new() { public T Create() { return new T(); } } yaz. Main'de var f = new Factory<Widget>(); var w = f.Create(); Console.WriteLine(w.Name); ekle.
Örnek çözüm:
using System;
class Factory<T> where T : new()
{
public T Create()
{
return new T();
}
}
class Widget
{
public string Name { get; set; } = "Merhaba";
}
class Program
{
static void Main()
{
var f = new Factory<Widget>();
var w = f.Create();
Console.WriteLine(w.Name);
}
}
Kendini test et
-
Kısıtı anlamına eşle
- where T : class
- Başvuru türü
- where T : struct
- Değer türü
- where T : new()
- Parametresiz yapıcı
- where T : IComparable<T>
- Karşılaştırılabilir
-
Kısıt yan tümcesi
class Factory<T> ____ T : new() { }Cevabı göster
class Factory<T> where T : new() { } -
new() kısıtı ne sağlar?
class Factory<T> where T : new() { public T Create() => ...; }- T'nin referans türü olmasını
- T'nin değer türü olmasını
- T içinde new T() yazılabilmesini
- T'nin sealed olmasını
Cevabı göster
T içinde new T() yazılabilmesini — Doğru. new() kısıtı new T() yazma izni verir.