795 votes

Direct fonte vs ' comme ' opérateur ?

Examinons le code suivant :

Quelle est la différence entre les trois types de moulage (OK, 3ème n’est pas un casting, mais vous obtenez l’intention...), et que l'on doit être préféré ?

921voto

Sander Points 9804
  1. Jette InvalidCastException si o n'est pas un string. Sinon, attribue o de s, même si o est null.
  2. Attribue null de s si o n'est pas un string ou si o est null. Pour cette raison, vous ne pouvez pas l'utiliser avec des types de valeur (l'opérateur ne pourrait jamais retourner null dans ce cas). Sinon, attribue o de s.
  3. Les Causes d'un NullReferenceException si o est null. Attribue quelle que soit o.ToString() renvoie à l' s, quel que soit le type o .

1 pour plus de conversions, de façon simple et directe. J'ai tendance à ne presque jamais utiliser 2 depuis si quelque chose n'est pas le bon type, j'ai l'habitude de s'attendre à une exception se produise. J'ai seulement vu un besoin pour ce retour, null type de fonctionnalité avec mal conçu bibliothèques qui utilisent des codes d'erreur (par exemple, de retourner la valeur null = erreur, au lieu d'utiliser des exceptions).

3 n'est pas un casting et est juste un appel de méthode. L'utiliser lorsque vous avez besoin de la représentation de chaîne d'un non-objet de type string.

390voto

Quibblesome Points 14441
<ol> <li>A utiliser lorsque quelque chose doit <em>certainement</em> être l’autre chose.</li> <li>Utiliser quand quelque chose <em>pourrait être</em> autre chose.</li> <li>Utiliser lorsque vous ne souciez pas ce que c’est mais vous voulez juste utiliser la représentation de chaîne disponibles.</li> </ol>

32voto

Blair Conrad Points 56195

Cela dépend vraiment de savoir si vous savez si o est une chaîne de caractères et ce que vous voulez faire avec elle. Si votre commentaire signifie qu' o vraiment vraiment est une chaîne, je préfère la droite (string)o fonte - il est peu probable à l'échec.

Le plus grand avantage de l'utilisation de la ligne droite en fonte est que, lorsqu'elle échoue, vous obtenez une InvalidCastException, qui vous dit assez bien ce qui s'est mal passé.

Avec l' as de l'opérateur, si o n'est pas une chaîne, s est définie à l' null, ce qui est pratique si vous n'êtes pas sûr et que vous souhaitez tester s:

string s = o as string;
if ( s == null )
{
    // well that's not good!
    gotoPlanB();
}

Toutefois, si vous n'effectuez pas le test, vous devez utiliser s plus tard et ont une NullReferenceException levée. Ceux-ci ont tendance à être plus fréquents et beaucoup plus difficile à identifier, une fois qu'ils se passe dans la nature, comme presque chaque ligne de déréférence un variable et peut jeter un. D'autre part, si vous êtes en train de jeter un type valeur (toute primitive, ou des structures telles que DateTime), vous devez utiliser le droit en fonte - as ne fonctionne pas.

Dans le cas particulier de la conversion d'une chaîne, chaque objet a un ToString, de sorte que votre troisième méthode peut être bien si o n'est pas nulle et que vous pensez que l' ToString méthode pourrait faire ce que vous voulez.

9voto

Mark Cidade Points 53945

Si vous savez déjà ce type qu'il peut lancer, utiliser un style C cast:

var o = (string) iKnowThisIsAString;

Note que c'est seulement avec un style C cast pouvez-vous effectuer explicite de contrainte de type.

Si vous ne savez pas si c'est le type désiré, et vous allez l'utiliser si elle est, à utiliser comme mot-clé:

var s = o as string;
if (s != null) return s.Replace("_","-");

//or for early return:
if (s==null) return;

Notez que tant que ne sera pas appeler n'importe quel type d'opérateurs de conversion. Il ne sera pas la valeur null si l'objet n'est pas null et natif du type spécifié.

Utiliser ToString() pour obtenir une chaîne explicite la représentation de tout objet, même si elle ne peut pas jeté à la chaîne.

7voto

Glenn Slaven Points 15742

L’as mot-clé est bonne dans asp.net lorsque vous utilisez la méthode FindControl.

Cela signifie que vous pouvez utiliser la variable typée, plutôt que de devoir ensuite effectuer un cast de `` comme vous le feriez avec une distribution directe :

Il n’est pas une chose énorme, mais il enregistre les lignes de code et assignation de variable, plus il est plus lisible

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