Dlaczego Resharper woli „jak” niż „jest”?

13

Kiedy piszę taki kod, gdzie obj jest zmienną lokalną:

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

Resharper oferuje zamianę tego kodu w następujący sposób:

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

Wolę ten pierwszy, ponieważ nie oferuje on możliwości przypadkowych wyjątków o zerowym odwołaniu. Jakie są powody, by preferować inną formę?

Dlaczego Resharper to zaleca?

Dave Hillier
źródło

Odpowiedzi:

25

Najpierw spójrz na odpowiedź Jona Skeeta, aby uzyskać ogólne pytanie dotyczące castingu w C #:

Nie rób tego:

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

Nie tylko sprawdza się to dwukrotnie, ale może sprawdzać różne rzeczy, jeśli randomObject jest polem, a nie zmienną lokalną. Możliwe jest, że „if” przejdzie, ale rzutowanie zakończy się niepowodzeniem, jeśli inny wątek zmieni wartość randomObject między nimi.

(...)

Jeśli randomObject może być instancją TargetType, a TargetType jest typem referencyjnym, użyj kodu w następujący sposób:

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

Następnie zobacz podobne tematy:

yBee
źródło
1
+1 Zobacz także post na blogu Erica Lipperta na ten temat.
Brian