Fundição: (NewType) vs. objecto como NewType

votos
79

Duplicate possíveis:
Fundição vs usando o 'como' palavra-chave no CLR

O que é realmente a diferença entre estes dois elencos?

SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;

Normalmente, ambos devem ser conversões explícitas para o tipo especificado?

Publicado 05/08/2008 em 16:42
fonte usuário
Em outras línguas...                            


13 respostas

votos
82

O primeiro vai lançar uma exceção se o tipo de origem não pode ser convertido para o tipo de destino. Este último irá resultar em SC2 ser um nulo de referência, mas sem excepção.

[Editar]

Minha resposta inicial é certamente a diferença mais pronunciada, mas como Eric Lippert assinala , não é o único. Outras diferenças incluem:

  • Você não pode usar o 'como' operador a lançar para um tipo que não aceita 'nulo' como um valor
  • Você não pode usar 'como' para converter coisas, como números de uma representação diferente (float para int, por exemplo).

E, finalmente, usando 'como' vs. o operador de conversão, você também está dizendo: "Eu não tenho certeza se isso vai ter sucesso."

Respondeu 05/08/2008 em 16:44
fonte usuário

votos
27

Também note que você só pode usar o como palavra-chave com um tipo de referência ou um tipo anulável

ou seja:

double d = 5.34;
int i = d as int;

não irá compilar

double d = 5.34;
int i = (int)d;

irá compilar.

Respondeu 05/08/2008 em 17:15
fonte usuário

votos
9

Typecasting usando "como" é, naturalmente, muito mais rápido quando a conversão falhar, uma vez que evita a despesa de lançar uma exceção.

Mas não é mais rápido quando o elenco bem-sucedido. O gráfico ao http://www.codeproject.com/KB/cs/csharpcasts.aspx é enganador porque não explica o que está medindo.

A linha inferior é:

  • Se você espera que o elenco para ter sucesso (ou seja, uma falha seria excepcional), use um elenco.

  • Se você não sabe se ele vai ter sucesso, use o operador "as" e testar o resultado para null.

Respondeu 16/09/2008 em 20:21
fonte usuário

votos
5

Uma diferença entre os dois métodos é que o (obj (SomeClass)) o primeiro pode causar um conversor de tipo a ser chamado.

Respondeu 08/11/2008 em 00:46
fonte usuário

votos
4

Bem o 'como' operador "ajuda" você enterra seu problema maneira mais baixa , porque quando ele é fornecido uma instância incompatíveis ele irá retornar null, talvez você vai passar isso para um método que vai passá-lo para outra e assim por diante e, finalmente, você' ll obter um NullReferenceException que vai fazer a sua depuração mais difícil.

Não abusar dela. O operador de conversão directa é melhor em 99% dos casos.

Respondeu 28/10/2010 em 10:21
fonte usuário

votos
4

Aqui está uma boa maneira de lembrar o processo que cada um deles siga que eu uso quando se tenta decidir o que é melhor para a minha circunstância.

DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);

ea próxima deve ser fácil de adivinhar o que ele faz

DateTime i = value as DateTime;

no primeiro caso, se o valor não pode ser convertido de uma exceção é lançada no segundo caso, se o valor não pode ser fundido, i é definido como nulo.

Assim, no primeiro caso, uma parada duro é feito se a conversão falhar na segunda elenco uma parada suave é feita e você pode encontrar um NullReferenceException mais tarde.

Respondeu 05/08/2008 em 18:46
fonte usuário

votos
3

Para expandir o comentário de Rytmis , você não pode usar o como palavra-chave para estruturas (tipos de valor), como eles não têm valor nulo.

Respondeu 07/09/2008 em 09:08
fonte usuário

votos
2

Tudo isso se aplica a tipos de referência, tipos de valor não pode usar a aspalavra-chave, pois não pode ser nulo.

//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;


//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;

A sintaxe elenco é mais rápido, mas só quando bem sucedido, é muito mais lento a falhar.

A melhor prática é usar asquando você não sabe o tipo:

//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;

//use as to find the right type
if( ( sc = someObject as SomeClass ) != null ) 
{
    //do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null ) 
{
    //do something with soc
}

No entanto, se você tem certeza absoluta de que someObjecté uma instância de SomeClassentão use elenco.

Em .Net 2 ou superior genéricos significa que você raramente precisa ter uma instância digitado-un de uma classe de referência, de modo que o último é menos frequentemente utilizado.

Respondeu 18/09/2008 em 12:10
fonte usuário

votos
1

E por uma questão de exaustividade, Eric Lippert tem um post sobre a diferença e algumas ressalvas.

Respondeu 09/10/2009 em 01:04
fonte usuário

votos
1

Para aqueles com experiência VB.NET, (tipo) é o mesmo que DirectCast e "como tipo" é o mesmo que TryCast.

Respondeu 16/09/2008 em 22:55
fonte usuário

votos
1

É como a diferença entre Parse e TryParse. Você usar TryParse quando você espera que ele pode falhar, mas quando você tem a garantia forte que não deixará você usa Parse.

Respondeu 08/08/2008 em 13:00
fonte usuário

votos
1

Eles vão jogar diferentes exceções.
(): NullReferenceException
como: InvalidCastException
que poderia ajudar na depuração.

O "como" tentativas de palavra-chave para converter o objeto e se a conversão falhar, será retornado nulo silenciosamente. A) operador de conversão (irá lançar uma exceção imediatamente se a conversão falhar.

"Só use o C # 'como' palavra-chave em que você está esperando o elenco de falhar em um caso não excepcional. Se você está contando com um elenco de ter sucesso e não estão preparados para receber qualquer objeto que iria falhar, você deve usar o () lançar operador para que uma exceção apropriado e útil é lançada."

Para exemplos de código e uma explicação adicional: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html

Respondeu 05/08/2008 em 16:49
fonte usuário

votos
1

O elenco parenthetical lança uma exceção se a tentativa de conversão falhar. O "como" elenco retorna null se a tentativa de conversão falhar.

Respondeu 05/08/2008 em 16:45
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more