Tür kısıtları
- C# kursu
- Orta seviye
- Ders 72/116
- 5 dk
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.
Başlangıç kodu
using System;
// Factory<T> generic sınıfını yaz (where T : new())
class Widget
{
public string Name { get; set; } = "Merhaba";
}
class Program
{
static void Main()
{
// Factory<Widget> ile Widget üret ve Name'i yazdır
}
}Ö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);
}
}Beklenen çıktı
Merhaba
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Kısıtı anlamına eşle
| Kavram | Anlamı |
|---|---|
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 |
2 Kısıt yan tümcesi
class Factory<T> ____ T : new() { }
class Factory<T> where T : new() { }
Açıklama: where yan tümcesi tür kısıdını başlatır.
3 new() kısıtı ne sağlar?
class Factory<T> where T : new()
{
public T Create() => ...;
}- T'nin referans türü olmasını
- T içinde new T() yazılabilmesini Doğru cevap
- T'nin değer türü olmasını
- T'nin sealed olmasını
Açıklama: new() kısıtı new T() yazma izni verir.