Tüm bağımsız yığın nesneleri şunlardan miras alır Object
; mantıklıdır, çünkü tüm bağımsız yığın nesnelerinin türlerini tanımlama gibi belirli ortak yönleri olmalıdır. Aksi takdirde, çöp toplayıcının bilinmeyen türde bir yığın nesnesine başvurusu olsaydı, o nesne ile ilişkili bellek bloğundaki hangi bitlerin diğer yığın nesnelerine referans olarak kabul edilmesi gerektiğini bilemezdi.
Ayrıca, tip sistemi içinde, yapı elemanlarını ve sınıf elemanlarını tanımlamak için aynı mekanizmayı kullanmak uygundur. Değer tipi depolama konumlarının (değişkenler, parametreler, alanlar, dizi yuvaları, vb.) Davranışı, sınıf tipi depolama konumlarından çok farklıdır, ancak bu tür davranışsal farklılıklar kaynak kodu derleyicilerinde ve yürütme motorunda ( JIT derleyicisi) yazın.
Bunun bir sonucu, bir değer türünün tanımlanmasının iki türü etkin bir şekilde tanımlamasıdır - bir depolama yeri türü ve bir yığın nesnesi türü. Birincisi dolaylı olarak ikincisine dönüştürülebilir ve ikincisi tipik olarak öncekine dönüştürülebilir. Her iki dönüştürme türü de, söz konusu türün bir örneğinden diğerine tüm genel ve özel alanları kopyalayarak çalışır. Ayrıca, genel kısıtlamaları kullanarak, önce bir kopyasını oluşturmadan arabirim üyelerini doğrudan bir değer türü depolama konumuna çağırmak mümkündür.
Tüm bunlar önemlidir, çünkü değer türü yığın nesnelerine yapılan başvurular değer türleri gibi değil sınıf başvuruları gibi davranır. Örneğin, aşağıdaki kodu ele alalım:
dize testEnumerator <T> (T it) burada T: IEnumerator <string>
{
var it2 = it;
it.MoveNext ();
it2.MoveNext ();
geri dön.Şu anda;
}
herkese açık geçersizlik testi ()
{
var theList = yeni Liste <string> ();
theList.Add ( "Fred");
theList.Add ( "George");
theList.Add ( "Percy");
theList.Add ( "Molly");
theList.Add ( "Ron");
var enum1 = theList.GetEnumerator ();
IEnumerator <string> enum2 = enum1;
Debug.Print (testEnumerator (enum1));
Debug.Print (testEnumerator (enum1));
Debug.Print (testEnumerator (enum2));
Debug.Print (testEnumerator (enum2));
}
Eğer testEnumerator()
yöntem değeri türünde bir depolama konumunu geçirilir, it
kimin kamu ve özel alanlar geçmiş-değerden kopyalanan bir örneğini alacaktır. Yerel değişken it2
, alanlarının tümü kopyalanan başka bir örneği barındırır it
. Arayan MoveNext
üzerinde it2
etkilemez it
.
Yukarıdaki kod, sınıf türünde bir depolama konumu geçirilirse, o zaman iletilen değer it
, ve it2
, aynı nesneye atıfta bulunur ve böylece MoveNext()
bunlardan herhangi birini çağırmak , etkin bir şekilde hepsini çağırır.
Not döküm olduğu List<String>.Enumerator
için IEnumerator<String>
etkin bir şekilde, bir sınıf tipi bir değer türünden döner. Öbek nesnesinin türü, List<String>.Enumerator
ancak davranışı aynı adın değer türünden çok farklı olacaktır.
object
.NET çerçevesinde bir kök var çünkü tüm nesneler arasında bazı temel yetenekler sağlıyor,ToString()
veGetHashCode()