- Casting vs à l’aide de la ' comme ' mot-clé dans le CLR (5 réponses )
Réponses
Trop de publicités?L'ancien va lever une exception si le type de la source ne peut pas être converti dans le type de cible. Ce dernier résultat dans sc2 être une référence nulle, mais pas exception.
[Modifier]
Ma réponse originale à cette question est certainement la plus grande différence, mais comme Eric Lippert souligne, ce n'est pas le seul. D'autres différences sont les suivantes:
- Vous ne pouvez pas utiliser le "comme" opérateur de cast pour un type qui n'accepte pas 'null', en tant que valeur
- Vous ne pouvez pas utiliser "comme" pour convertir des choses, comme les nombres à une représentation différente (float int, par exemple).
Et enfin, à l'aide de "comme" contre l'opérateur de cast, vous êtes également en disant: "je ne suis pas sûr si cela va réussir."
Typecasting à l'aide de "" est bien sûr beaucoup plus rapide lors de la conversion échoue, car elle évite les frais de lancer une exception.
Mais il n'est pas plus rapide lors de la fonte de la réussite. Le graphique http://www.codeproject.com/KB/cs/csharpcasts.aspx est trompeuse, car elle n'explique pas ce que c'est la mesure.
La ligne de fond est:
Si vous vous attendez à ce que la fonte de réussir (c'est à dire un échec serait exceptionnel), l'utilisation d'un plâtre.
Si vous ne savez pas si il va réussir, utiliser le "comme" de l'opérateur et de tester le résultat null.
Une différence entre les deux approches, c’est que le premier ((SomeClass) obj) peut causer un convertisseur de type être appelé.
Voici une bonne façon de rappeler le processus par lequel chaque d'entre eux suivent que j'utilise lorsque vous essayez de décider ce qui est mieux pour ma situation.
DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);
et la prochaine devrait être facile à deviner ce qu'il fait
DateTime i = value as DateTime;
dans le premier cas, si la valeur ne peut pas être lancé qu'une exception est levée dans le second cas, si la valeur ne peut pas être lancé, je l'ai est mis à null.
Ainsi, dans le premier cas, un arrêt dur est fait si la conversion échoue dans le second lancer, un arrêt progressif est fait et que vous risquez de rencontrer un NullReferenceException plus tard.