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 NullReferenceException
ou ArgumentNullException
ou même une erreur logique dans le futur. En général, une as
expression qui n'est pas suivie d'une null
vé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 as
place d'une distribution normale enveloppée d'un try-catch
bloc. De plus, l'utilisation de as
est 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 isinst
instruction pour le is
mot - clé et une castclass
instruction 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 isinst
instruction. 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 is
ré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()