Sua compreensão é verdadeira. Isso parece tentar otimizar para mim. Você deve usar um elenco normal quando tiver certeza do tipo. Além de gerar uma exceção mais sensata, também falha rapidamente. Se você está errado sobre a sua suposição sobre o tipo, o programa irá falhar imediatamente e você será capaz de ver a causa da falha imediatamente em vez de esperar por um NullReferenceException
ou ArgumentNullException
ou mesmo um algum erro lógico no futuro. Em geral, uma as
expressão que não é seguida por uma null
verificação em algum lugar é um cheiro de código.
Por outro lado, se você não tem certeza sobre o elenco e espera que ele falhe, use-o em as
vez de um elenco normal envolvido com um try-catch
bloco. Além disso, as
recomenda-se o uso de uma verificação de tipo seguida por uma conversão. Ao invés de:
if (x is SomeType)
((SomeType)x).SomeMethod();
que gera uma isinst
instrução para a is
palavra - chave e uma castclass
instrução para o elenco (realizando o elenco duas vezes), você deve usar:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Isso gera apenas uma isinst
instrução. O método anterior possui uma falha em potencial em aplicativos multithread, pois uma condição de corrida pode fazer com que a variável mude de tipo após a is
verificação ser bem-sucedida e falhar na linha de conversão. O último método não é propenso a esse erro.
A solução a seguir não é recomendada para uso em código de produção. Se você realmente odeia uma construção fundamental em C #, considere mudar para o VB ou algum outro idioma.
Caso alguém odeie desesperadamente a sintaxe do elenco, ele / ela pode escrever um método de extensão para imitar o elenco:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
e use uma sintaxe pura [?]:
obj.To<SomeType>().SomeMethod()