2010-11-18 23 views
2

Bu sınıf düşünüldüğünde:Bir sınıfın bir parçası olarak bildirildiğinde bir ValueType kutulu mu?

public class Foo 
{ 
    public Int32 MyField; 
} 

Ben birkaç iş parçacığı tarafından erişilebilir olabilir gibi bu durum yönetilen yığın kesinlikle olmak zorunda çünkü "MyField" elemanı ipliği yığınının üzerinde değil sanırım, ama bunun anlamı yok Her kullanıldığı zaman kutulu ve kutulu değil mi? peşin

+0

Herkese teşekkürler! – vtortola

+0

Değer türlerinin referans türlerinden nasıl farklı olduğuna dair pek çok açıklama okuyucuya yanıltıcı olabilir, çünkü bunlar yığın üzerinde değer türlerinin var olduğunu söylemektedir; Bir yöntem içinde bildirilen değer türü değişkenleri hakkında konuşuyorsanız sadece gerçekten durum böyle. James Curran'ın buradaki cevabının, "Yığında" ve "Yığın İçinde" yerine bir nesne için ayrılan belleğin yerini açıklamak için "Burada Burada" ve "Orada" terimlerini kullanmanın iyi bir önerisi olduğunu düşündüm. /stackoverflow.com/questions/3790436/where-are-value-types-stored-in-c-generic-collections/3790468#3790468 –

+0

Ve bir değer türü değişkeni bir yöntem içinde bildirildiğinde bile, herhangi bir sebepten ötürü yığın. Eric Lippert'in "Değer Türleri Hakkında Hakikat" konusuna bakın. http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx –

cevap

8

Hayır, her kullanıldığında kutulu değildir. Boks, sadece bir referans türüne bir referans türünü zorladığınızda gerçekleşir - gerçekten değerin gerçek belleğinin tahsis edildiği (veya herhangi bir bellek tahsis edilmiş olsa bile) ile hiçbir ilgisi yoktur.

Sizin durumunuzda, kutunun nasıl yapıldığını değil, Foo'nun nasıl işleneceğini değil, MyField'da nasıl davranacağınızdır. ikinci örnekte val artık bir kutulu int için bir referans içerir

//No Boxing 
    var f = new Foo(); 
    f.MyField = 5; 
    int val = f.MyField; 


    //Boxing 
    var f = new Foo(); 
    f.MyFIeld = 5; 
    object val = f.MyField; 

not edin. MyField hala (ve her zaman kalacaktır) bir kutulanmamış int ve (teşekkürler gerekli açıklama, LukeH işaret için)

+2

İkinci örneğinizde 'val' değişkeninin kutulu olduğunu vurgulayan değer int'; MyField'ın kendisi asla kutulu değildir. – LukeH

2

yok içinde

sayesinde değer türü kutulu değildir.

Boks yalnızca, bir nesne gibi bir değer türü kullandığınızda, örneğin int bir object dizisinde saklanırken oluşur. Bu,

object[] a = new object[10]; 
int x = 1; 
a[0] = x; 

Bu durumda, değer türü kutucuktur.

Ancak sınıf içinde bir alan olarak saklanan bir değer türü kutlanmaz.

2

Hayır, bir değer türü bir System.Object olarak kabul edilir zaman boks yalnızca oluşur (unboxing olmadan ulaşılabilir genellikle örtülü döküm yoluyla, yani bir yöntem parametresi olarak geçerek)

1

Değer türleri yalnızca referans tipi değişkenine atandıklarında kutulanır (örn. object). MyField'u hiçbir zaman int ya da başka bir yapının (örneğin double) dışında atamayacaksanız, asla kutulu olmaz.

İlgili konular