2

C# での Boxing と Unboxing について少し疑問があります。

int i=1;
System.Int32 j = i;

上記のコードはボクシングとして呼び出すことができますか?

4

4 に答える 4

12

No, that's not boxing at all. int is just an alias for System.Int32. That code is equivalent to:

int i = 1;
int j = i;

For boxing to occur, there has to be a conversion to a reference type, e.g.

int i = 1;
object j = i;

Or:

int i = 1;
IComparable j = i;
于 2013-03-22T08:44:22.243 に答える
2

ジョンの答えを少しだけ拡張するために、基本クラスの非オーバーライドまたは非仮想メソッドも呼び出すと、ボクシングも発生します。

i.GetType(); //boxing occur here

またはint、参照型を必要とするメソッドに渡します

void Foo(object obj) {}

Foo(i); //boxing, no overload takes an int

最初の例では、指示ILをはっきりと見ることができますbox

int i = 5;
i.GetType();

IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     // i
IL_0002:  ldloc.0     // i
IL_0003:  box         System.Int32    //<---- boxing
IL_0008:  call        System.Object.GetType

値の型で仮想メソッドをオーバーライドしない場合、呼び出し時にそれらもボックス化されます

enum MyEnum {}

var e = new MyEnum();
e.ToString(); //box will occur here, see IL for details

IL_0000:  ldc.i4.0    
IL_0001:  stloc.0     // e
IL_0002:  ldloc.0     // e
IL_0003:  box         UserQuery.MyEnum
IL_0008:  callvirt    System.Object.ToString

構造体と同じ状況callvirtですが、必要に応じて構造体をボックス化するオペコードを使用することを除いて、

于 2013-03-22T08:48:17.097 に答える
0

いいえ、int は値型です。

オブジェクトに値の型を割り当てると、ボックス化が発生します。

于 2013-03-22T08:45:20.393 に答える
0

ボクシングではありません。

intのエイリアスですSystem.Int32。したがって、あなたのコードは次のものと同等です。

int i = 1;
int j = i;

ボックス化の場合、オブジェクトまたはインターフェイスへの変換が必要です。お気に入り;

int i = 1;
object j = i;

クラス型の値は、コンパイル時に参照を別の型として扱うだけで、オブジェクト型またはクラスによって実装されるインターフェイス型に変換できます。同様に、オブジェクト型の値またはインターフェイス型の値は、参照を変更せずにクラス型に戻すことができます (もちろん、この場合は実行時の型チェックが必要です)。

于 2013-03-22T08:48:05.693 に答える