15

次の質問に対する答えが見つかりません。

object o = 10; // Box
int i = (int)o; // Unbox

それは明らかですが、以下は明確ではありません

bool isInt = o is int; // Is the unbox here or not?
4

3 に答える 3

29

いいえ、それはボックス化解除ではありません。タイプが正しいかどうかを確認するだけです。タイプを持つオブジェクトが実際に関係していることを忘れないでください。その型のチェックは、値がボックス化された値型の値であるかどうかに関係なく、基本的に同じ操作です。(考慮すべき継承がないため、値の型またはシールされた型に対して実行可能ないくつかの最適化があるかもしれませんが、基本的にはオブジェクト ヘッダーの「型」部分をチェックしています。)

これを確認する 1 つの方法は、コードをコンパイルし、ILASM を使用して IL を確認することです。

// object o = 10
IL_0000:  ldc.i4.s   10
IL_0002:  box        [mscorlib]System.Int32
IL_0007:  stloc.0

// int i = (int) o;
IL_0008:  ldloc.0
IL_0009:  unbox.any  [mscorlib]System.Int32
IL_000e:  stloc.1

 // bool isInt = o is int
IL_000f:  ldloc.0
IL_0010:  isinst     [mscorlib]System.Int32

したがって、使用しますisinst-ボックス化解除は必要ありません。

于 2012-08-31T20:28:06.860 に答える
5

箱から出す必要がないだけでなく、論理的にはできません。

ボックス化解除しようとしている型の値がオブジェクトに実際に含まれているかどうかに応じて、ボックス化解除が成功または失敗する可能性があります。

したがって、ボックス化解除では、オブジェクトがその特定のタイプであるかどうかを確認する必要があります。

したがって、型のテストにボックス化解除が必要な場合、ボックス化解除には型のテストが必要であるため、最初にボックス化解除するまでボックス化解除できません...

したがって、型をテストするためにボックス化解除が必要になることはありません。

于 2012-08-31T23:18:04.683 に答える