このクラスを考えると:
public class Foo
{
public Int32 MyField;
}
「MyField」メンバーは、複数のスレッドからアクセスできるため、マネージドヒープに確実に存在する必要があるため、スレッドスタックにはないと思いますが、使用されるたびにボックス化およびボックス化解除されることを意味しますか?
前もって感謝します
このクラスを考えると:
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;
val
2 番目の例では、ボックス化された int への参照が含まれている ことに注意してください。MyField
まだ(そして常に残ります)ボックス化されていないintであり、ボックス化を解除せずにアクセスできます(必要な説明を指摘してくれてありがとう、LukeH)
いいえ、ボックス化は、値の型が System.Object として扱われる場合にのみ発生します (通常は暗黙的なキャスト、つまりメソッド パラメーターとして渡す)。
いいえ、値の型はボックス化されていません。
int
ボックス化は、 の配列に を格納する場合など、値の型をオブジェクトのように使用する場合にのみ発生しますobject
。あれは:
object[] a = new object[10];
int x = 1;
a[0] = x;
その場合、値の型はボックス化されます。
ただし、クラス内のフィールドとして格納される値の型はボックス化されません。
値型は、参照型変数 (例: object
) に割り当てられている場合にのみボックス化されます。MyField
int またはキャスト可能な別の構造体 (例: ) 以外に代入しない場合double
、ボックス化されることはありません。