2010-11-18 5 views
2

このクラスを考える:クラスの一部として宣言されている場合、ValueTypeはボックス化されますか?

public class Foo 
{ 
    public Int32 MyField; 
} 

、私はそれが複数のスレッドによってアクセスできるように、それはマネージヒープに間違いなければならないが、それは意味しないので、「のMyField」メンバーは、スレッドスタックにはないと思いますそれは使用されるたびにボックス化されボックス化されていませんか?

ありがとうございます。

+0

ありがとうございました! – vtortola

+0

私は、値の型が参照型とどのように異なっているかについての多くの説明は、値型がスタック上に存在すると言っているので、読み手を誤解させるかもしれないと思う。これはメソッド内で宣言された値型変数について話している場合にのみ当てはまります。私は、ジェームス・カランの答えは、ここでは、「ここにある」と「そこに」という言葉を使って、「スタック内」と「ヒープ内」ではなく、オブジェクトに割り当てられたメモリの場所を記述することを提案しました。http: /stackoverflow.com/questions/3790436/where-value-types-stored-in-c-generic-collections/3790468#3790468 –

+0

また、値型変数がメソッド内で宣言されている場合でも、値型変数はメソッド内で宣言されていても、ヒープにはさまざまな理由があります。 Eric Lippertの「価値観の真実」を参照してください。 http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx –

答えて

8

いいえ、使用するたびに箱に入れません。ボクシングは、参照型に値型を強制しているときにのみ発生します。実際には値の実際のメモリが割り当てられた場所とは何の関係もありません(またはメモリが割り当てられていても)。

あなたのケースでは、Fooの扱い方ではなく、ボックス化されているかどうかを判断するのはMyFieldの行動です。

//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; 

valには、ボックス化されたintへの参照が含まれています。 MyFieldはボックス化されていないint型であり、アンボックスなしでアクセスできます(必要な説明を指摘してくれてありがとう、LukeH

+2

2番目の例では、val変数がボックス化された ' int'; MyField自体はボックス化されません。 – LukeH

2

いいえ、値の種類はボックス化されていません。

ボクシングは、objectの配列にintを格納する場合など、値の型をオブジェクトのように使用する場合にのみ発生します。つまり:

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

この場合、値の種類はボックスで囲みます。

しかし、クラス内にフィールドとして格納されている値の型はボックス化されていません。

2

いいえ、値の型はSystem.Objectとして扱われます通常は暗黙のキャスト、つまりメソッドのパラメータとして渡す)

1

値の型は、参照型変数(たとえば、object)に割り当てられている場合にのみボックス化されます。 MyFieldをintや他の構造体にキャストできるもの以外に割り当てない場合(例:double)、それは決してボックス化されません。

関連する問題