90 votes

Casting : (NewType) vs objet comme NewType

<blockquote> <p><strong>Doublon possible :</strong><br> <a href="http://stackoverflow.com/questions/496096/casting-vs-using-the-as-keyword-in-the-clr">Casting vs en utilisant le mot clé « as » dans le CLR</a> </p> <p>Ce qui est en fait la différence entre ces deux moulages ?</p><pre><code></code></pre><p>Normalement, ils devraient tous deux être des casts explicites vers le type spécifié ?</p></blockquote>

88voto

Rytmis Points 15848

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."

27voto

denny Points 1071

Notez également que vous ne pouvez utiliser comme mot clé avec un type référence ou un type nullable

Télécharger

ne compile pas

compilera.

11voto

Joe Points 60749

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.

5voto

Cristian Libardo Points 7425

Une différence entre les deux approches, c’est que le premier ((SomeClass) obj) peut causer un convertisseur de type être appelé.

4voto

Nick Berardi Points 31361

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X