Por que o Resharper prefere "como" a "é"?


13

Quando escrevo código como este, em que obj é uma variável local:

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

O Resharper oferece a alteração para um código como este:

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

Prefiro o primeiro, pois ele não oferece oportunidade para exceções acidentais de referência nula. Que razões existem para preferir a outra forma?

Por que o Resharper recomenda isso?

Respostas:


25

Primeiramente, olhe a resposta de Jon Skeet para uma pergunta geral sobre conversão em C #:

Não faça isso:

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

Essa verificação não é apenas duas vezes, mas também pode estar verificando coisas diferentes, se randomObject for um campo e não uma variável local. É possível que o "if" seja aprovado, mas a conversão falhe, se outro thread alterar o valor de randomObject entre os dois.

(...)

Se randomObject puder ser uma instância de TargetType e TargetType for um tipo de referência, use um código como este:

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

Então veja tópicos semelhantes:


1
+1 Veja também a postagem no blog de Eric Lippert sobre o assunto.
22713 Brian
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.