2012-08-31 8 views

答えて

26

いいえ、それはアンボクシングではありません明確ではありません - それだけのタイプかどうかをチェックしています正しい。実際にオブジェクトが関与していることを忘れないでください。その型のチェックは、値がボックス化された値の型の値であるかどうかにかかわらず、基本的に同じ操作です。 (継承は考慮されないため、値の型や密封された型にはいくつかの最適化が可能ですが、基本的にオブジェクトヘッダーの "型"部分をチェックしています)。

コンパイルするかどうかを確認する方法コードとは、IL使っILASMを見て:

// 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使用しています - 何のアンボクシングは必要ありません。

+2

CLRはアンボックスしないでタイプをチェックできますか? –

+3

@ViacheslavSmityukh:はい。実際にオブジェクトが関与していることを忘れないでください。その型のチェックは、値がボックス化された値の型の値であるかどうかにかかわらず、基本的に同じ操作です。 –

+2

@JonSkeetあなたは答えにそのコメントを編集できますか?私は説明していると思います。 – Servy

5

論理的にアンボックスする必要はないだけでなく、論理的にはできません。

アンボックスは、アンボックスにしようとしているタイプの値が実際にオブジェクトに含まれているかどうかによって、成功または失敗することがあります。

したがって、アンボックスでは、オブジェクトがその特定の種類であるかどうかのチェックが必要です。

アンボクシング必要なタイプをテストする場合はアンボクシングは種類のテストを必要とするため、我々は...

は、そのためのタイプをテストすることは、第1箱なし必要とすることはできませんでしょうまでそのため、その後、我々はVHS版することはできませんアンボックス。

0

C#7以降、isキーワードは、型パターンとしてのパターンマッチングで新しい使用例を得ました。この場合、アンボクシングは、例えば発生した:

object o = 10; 
if (o is int i) { 
    // i is the unboxed value. 
} 

は明らかに、これは、あなたが実際に値を代入しているパターンとしてisを使用した場合、元のポストの値は純粋にテストされている場合、異なる場合です。したがって、この場合にはunboxする必要があります。

明らかに - 元のメッセージについては何も変更されていません。o is intケース - 古い回答ごとにアンボックスは発生しません。 isというキーワードが新しい役割を果たしました。

関連する問題