C# での Boxing と Unboxing について少し疑問があります。
int i=1;
System.Int32 j = i;
上記のコードはボクシングとして呼び出すことができますか?
C# での Boxing と Unboxing について少し疑問があります。
int i=1;
System.Int32 j = i;
上記のコードはボクシングとして呼び出すことができますか?
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;
ジョンの答えを少しだけ拡張するために、基本クラスの非オーバーライドまたは非仮想メソッドも呼び出すと、ボクシングも発生します。
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
ですが、必要に応じて構造体をボックス化するオペコードを使用することを除いて、
いいえ、int は値型です。
オブジェクトに値の型を割り当てると、ボックス化が発生します。
ボクシングではありません。
int
のエイリアスですSystem.Int32
。したがって、あなたのコードは次のものと同等です。
int i = 1;
int j = i;
ボックス化の場合、オブジェクトまたはインターフェイスへの変換が必要です。お気に入り;
int i = 1;
object j = i;
クラス型の値は、コンパイル時に参照を別の型として扱うだけで、オブジェクト型またはクラスによって実装されるインターフェイス型に変換できます。同様に、オブジェクト型の値またはインターフェイス型の値は、参照を変更せずにクラス型に戻すことができます (もちろん、この場合は実行時の型チェックが必要です)。