クラスの一部として宣言されている場合ValueTypeには箱入り取得していますか?

StackOverflow https://stackoverflow.com/questions/4216612

質問

このクラスを考慮します:

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場合、それは今まで箱入りされません。

scroll top