Generic vs object
Generic ile object arasındaki tip güvenliği farkını öğrenirsin.
Generic olmayan alternatif: object
C#'ta object tüm türlerin tabanıdır. Bir özelliği object türünde yaparsan her değeri tutabilir: public object Value { get; set; }. Ama bu yöntemin büyük bir sorunu vardır: kutulama (boxing) ve cast (tür dönüşümü) zorunluluğu.
Örneğin int değerini object'e atarken kutulanır; geri alırken (int) dönüşümü gerekir. Yanlış türe cast yaparsan InvalidCastException fırlar. Generic sınıflar bu sorunu kökten çözer: Box<int>'te kutulama olmaz, cast gerekmez, hata derleme anında yakalanır.
Kutulamanın gizli maliyeti
int'i object'e atmak yalnızca syntax değil, bir bellek olayıdır. Değer türü yığında (stack) değil, öbek üzerinde (heap) kutulanır. Bu, ek bellek ayırma ve kopyalama demektir. Sık tekrarlandığında performans düşer.
Generic sınıflarda kutulama olmaz: Box<int>'in içindeki int doğrudan özellikte durur. Bu yüzden List<int>, eski ArrayList'ten çok daha hızlıdır. Generic, tip güvenliği ve performansı aynı anda sunar.
Uygulama ObjectBox ve Box<T> karşılaştır
ObjectBox sınıfını tanımla; public object Value { get; set; } olsun. Box<T> generic sınıfını tanımla; public T Value { get; set; } olsun. Main içinde ObjectBox örneği üret, Value = 42 ata, (int) cast ile geri al ve yazdır. Aynıını Box<int> ile de yap; cast gerekmeden yazdır.
Örnek çözümü göster
class ObjectBox { public object Value { get; set; } } ve class Box<T> { public T Value { get; set; } } yaz. Main'de var ob = new ObjectBox { Value = 42 }; int n = (int)ob.Value; Console.WriteLine(n); var gb = new Box<int> { Value = 42 }; Console.WriteLine(gb.Value); ekle.
Örnek çözüm:
using System;
class ObjectBox
{
public object Value { get; set; }
}
class Box<T>
{
public T Value { get; set; }
}
class Program
{
static void Main()
{
var ob = new ObjectBox { Value = 42 };
int n = (int)ob.Value;
Console.WriteLine(n);
var gb = new Box<int> { Value = 42 };
Console.WriteLine(gb.Value);
}
}
Kendini test et
-
Yaklaşımı özelliğine eşle
- object
- Kutulama gerektirir
- <T>
- Tip güvenli
- (int) cast
- Çalışma zamanı riski
- derleme hatası
- Generic güvencesi
-
object içine int koyup geri alırken ne gerekir?
object o = 42; int n = ______;- Cast (int)o
- Hiçbir şey, n = o
- Boxing operator
- new int(o)
Cevabı göster
Cast (int)o — Doğru. object'ten int'e çıkmak için (int) cast gerekir.
-
object özelliği
public ____ Value { get; set; } // kutulama gerektirirCevabı göster
public object Value { get; set; } // kutulama gerektirir