クラスの一部として宣言されている場合ValueTypeには箱入り取得していますか?
-
26-09-2019 - |
質問
このクラスを考慮します:
public class Foo
{
public Int32 MyField;
}
私は、それが複数のスレッドによってアクセスできるように、それはマネージヒープに間違いなければならないので、「のMyField」メンバーはスレッドスタック上にないと思いますが、それはそれは箱入りれるとアンボクシング毎回、それが使われることを意味しますか?
事前に感謝します。
解決
いいえ、それは、それが使用されるたびに箱詰めされていません。あなたが参照型に値型を強制変換する際にボクシングにのみ発生 - それは本当に価値の実際のメモリが割り当てられた(または任意のメモリが割り当てられた場合でも)どことは何の関係もありません。
あなたのケースでは、それはあなたがそれが箱入りだ場合、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;
第2の例示的val
に今箱入りintへの参照が含まれていることを注意。 MyField
はまだ(と常に残ります)箱なしint型と必要な明確化、 LukeH を指摘するためにアンボクシング(感謝せずにアクセスすることができます>)
他のヒント
いいえ、値型がボックス化されていません。
int
の配列でobject
を保存するとき、それは例えば、オブジェクトであるかのようにあなたが値型を使用する場合、ボクシングにのみ発生します。それは次のとおりです。
object[] a = new object[10];
int x = 1;
a[0] = x;
はその場合、値型がボックス化されている。
はしかし、クラス内のフィールドとして格納された値型がボックス化されていない。
いいえ、値型が(すなわちメソッドのパラメータとして渡し、通常暗黙キャスティングによって)のSystem.Objectとして扱われた場合にのみ発生ボクシング
これらは、参照型の変数(例えば
object
)に割り当てられているときに値型だけ箱入ります。 intまたはそれはキャスト可能な他の構造体(例えばMyField
)以外に、あなたは決して割り当てdouble
場合、それは今まで箱入りされません。
所属していません StackOverflow