Warum bevorzugt Resharper "wie" gegenüber "ist"?

13

Wenn ich Code wie diesen schreibe, ist obj eine lokale Variable:

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

Resharper bietet an, den Code folgendermaßen zu ändern:

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

Ich bevorzuge das erstere, da es keine Möglichkeit für versehentliche Nullreferenzausnahmen bietet. Welche Gründe sprechen dafür, die andere Form zu bevorzugen?

Warum empfiehlt Resharper dies?

Dave Hillier
quelle

Antworten:

25

Schauen Sie sich zunächst die Jon Skeet-Antwort auf die allgemeine Frage zum Casting in C # an:

Mach das nicht:

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

Dies wird nicht nur zweimal überprüft, sondern es werden möglicherweise auch verschiedene Dinge überprüft, wenn randomObject ein Feld und keine lokale Variable ist. Es ist möglich, dass das "Wenn" übergeben wird, die Umwandlung jedoch fehlschlägt, wenn ein anderer Thread den Wert von randomObject zwischen den beiden ändert.

(...)

Wenn randomObject eine Instanz von TargetType und TargetType ein Referenztyp ist, verwenden Sie folgenden Code:

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

Dann sehen Sie sich ähnliche Themen an:

yBee
quelle
1
+1 Siehe auch Eric Lipperts Blogpost zum Thema.
Brian