Votre compréhension est vrai. Qui sonne comme essayer de micro-optimiser pour moi. Vous devez utiliser une normale de voter lorsque vous êtes sûr du type. En plus de générer un plus raisonnable d'exception, c'est aussi ne pas jeûner. Si vous vous trompez au sujet de votre hypothèse sur le type, votre programme ne fonctionnera pas immédiatement et vous serez en mesure de voir la cause de la panne immédiatement plutôt que d'attendre une NullReferenceException
ou ArgumentNullException
ou même une erreur de logique dans l'avenir. En général, un as
expression qui n'est pas suivie par un null
case quelque part est une odeur de code.
D'autre part, si vous n'êtes pas sûr au sujet de la fonte et de l'attendre à l'échec, vous devez utiliser as
, au lieu de la normale coulé enveloppé avec un try-catch
bloc. En outre, l'utilisation de l' as
est recommandé au cours d'une vérification de type suivi par un casting. Au lieu de:
if (x is SomeType)
((SomeType)x).SomeMethod();
ce qui génère un isinst
instructions pour l' is
mot-clé, et un castclass
instructions pour le casting (acquittent efficacement de la fonte à deux reprises), vous devez utiliser:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Cela ne génère un isinst
enseignement. La première méthode a une potentielle faille de sécurité dans des applications multithread comme une condition de concurrence peut causer de la variable à modifier son type après l' is
vérifier réussi et ne parviennent pas à la fonte de la ligne. Cette dernière méthode n'est pas sujette à l'erreur.
La solution suivante est pas recommandé pour une utilisation dans le code de production. Si vous avez vraiment la haine fondamentale à construire en C#, vous pourriez envisager de passer à VB ou une autre langue.
Dans le cas où un désespérément déteste le casting de la syntaxe, il/elle peut écrire une méthode d'extension pour imiter le casting:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
et l'utilisation d'un pur[?] syntaxe:
obj.To<SomeType>().SomeMethod()