Votre compréhension est vraie. Cela ressemble à essayer de micro-optimiser pour moi. Vous devez utiliser un casting normal lorsque vous êtes sûr du type. En plus de générer une exception plus sensible, il échoue également rapidement. Si vous vous trompez sur votre hypothèse sur le type, votre programme échouera immédiatement et vous pourrez voir la cause de l'échec immédiatement plutôt que d'attendre une NullReferenceExceptionou ArgumentNullExceptionou même une erreur logique dans le futur. En général, une asexpression qui n'est pas suivie d'une nullvérification quelque part est une odeur de code.
D'un autre côté, si vous n'êtes pas sûr de la distribution et que vous vous attendez à ce qu'elle échoue, vous devez utiliser à la asplace d'une distribution normale enveloppée d'un try-catchbloc. De plus, l'utilisation de asest recommandée par rapport à une vérification de type suivie d'un plâtre. Au lieu de:
if (x is SomeType)
((SomeType)x).SomeMethod();
qui génère une isinstinstruction pour le ismot - clé et une castclassinstruction pour le casting (exécutant effectivement le casting deux fois), vous devez utiliser:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Cela ne génère qu'une isinstinstruction. La première méthode présente un défaut potentiel dans les applications multithread car une condition de concurrence peut entraîner le changement de type de la variable après la isréussite de la vérification et l'échec de la ligne de distribution. Cette dernière méthode n'est pas sujette à cette erreur.
La solution suivante n'est pas recommandée pour une utilisation dans le code de production. Si vous détestez vraiment une construction aussi fondamentale en C #, vous pourriez envisager de passer à VB ou à un autre langage.
Dans le cas où l'on déteste désespérément la syntaxe du cast, il / elle peut écrire une méthode d'extension pour imiter le cast:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
et utilisez une syntaxe [?] soignée:
obj.To<SomeType>().SomeMethod()