Resharperが「is」より「as」を好むのはなぜですか?


13

次のようなコードを書くと、objはローカル変数です。

if (obj is IMyInterface)
{
   var result = (IMyInterface)obj;
   // ....
}

Resharperは、次のようなコードに変更することを提案しています。

var result = obj as IMyInterface;
if (result != null)
{
   // ...
}

前者は、誤ってnull参照の例外が発生する可能性がないため、前者の方が好きです。他の形式を好む理由は何ですか?

Resharperがこれを推奨する理由は何ですか?

回答:


25

C#でのキャストに関する一般的な質問については、まずジョンスキートの回答ご覧ください。

これをしないでください:

if (randomObject is TargetType)
{
    TargetType foo = (TargetType) randomObject;
    // Do something with foo
}

randomObjectがローカル変数ではなくフィールドである場合、これは2回チェックされるだけでなく、異なることをチェックする場合があります。別のスレッドが2つの間でrandomObjectの値を変更すると、「if」は合格するが、キャストが失敗する可能性があります。

(...)

randomObjectがTargetTypeのインスタンスであり、TargetTypeが参照型である場合、次のようなコードを使用します。

TargetType convertedRandomObject = randomObject as TargetType;
if (convertedRandomObject != null)
{
    // Do stuff with convertedRandomObject
}

次に、同様のトピックを参照してください。


1
+1 このトピックに関するEric Lippertのブログ投稿も参照してください。
ブライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.