3

このクラスを考えると:

public class Foo
{
    public Int32 MyField;
}

「MyField」メンバーは、複数のスレッドからアクセスできるため、マネージドヒープに確実に存在する必要があるため、スレッドスタックにはないと思いますが、使用されるたびにボックス化およびボックス化解除されることを意味しますか?

前もって感謝します

4

4 に答える 4

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;

val2 番目の例では、ボックス化された int への参照が含まれている ことに注意してください。MyFieldまだ(そして常に残ります)ボックス化されていないintであり、ボックス化を解除せずにアクセスできます(必要な説明を指摘してくれてありがとう、LukeH

于 2010-11-18T15:47:57.960 に答える
2

いいえ、ボックス化は、値の型が System.Object として扱われる場合にのみ発生します (通常は暗黙的なキャスト、つまりメソッド パラメーターとして渡す)。

于 2010-11-18T15:48:00.460 に答える
2

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

intボックス化は、 の配列に を格納する場合など、値の型をオブジェクトのように使用する場合にのみ発生しますobject。あれは:

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

その場合、値の型はボックス化されます。

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

于 2010-11-18T15:47:15.027 に答える
1

値型は、参照型変数 (例: object) に割り当てられている場合にのみボックス化されます。MyFieldint またはキャスト可能な別の構造体 (例: ) 以外に代入しない場合double、ボックス化されることはありません。

于 2010-11-18T15:48:25.420 に答える