Lorsque je travaille avec des implémentations d'interface explicites en C#, il est souvent nécessaire de lancer un objet sur l'une de ses interfaces pour accéder à un membre de cette interface. En raison de la fiabilité et de la facilité de maintenance améliorées offertes par la vérification du type de temps de compilation, j'ai toujours préféré utiliser des conversions implicites pour effectuer cela. La seule façon dont je sais de faire cela implique deux lignes de code et introduit une autre variable dans la portée. Voici un exemple:Accès sécurisé et simple aux membres de l'interface explicite en C#
public interface IMyType
{
string SayHello();
}
public class MyType : IMyType
{
string IMyType.SayHello() { return "Hello!"; }
}
class Program
{
static void Main(string[] args)
{
var item = new MyType();
// Option 1 - Implicit cast. Compile time checked but takes two lines.
IMyType item2 = item;
System.Console.WriteLine(item2.SayHello());
// Option 2 - One line but risks an InvalidCastException at runtime if MyType changes.
System.Console.WriteLine(((IMyType)item).SayHello());
// Option 3 - One line but risks a NullReferenceException at runtime if MyType changes.
System.Console.WriteLine((item as IMyType).SayHello());
}
}
Parce que le compilateur sait que MyType
outils IMyType
Je suppose qu'un casting implicite est mieux qu'un explicite car un changement plus tard à la déclaration de MyType
entraînera une erreur de compilation au lieu d'un InvalidCastException
à l'exécution. Cependant, je préfère quelque peu la simplicité de la syntaxe de transtypage explicite et l'ai souvent utilisée dans le code d'autres personnes.
Ma question est triple:
- Laquelle des options ci-dessus ne vous préférez (et pourquoi)?
- Y a-t-il une meilleure façon de faire cela?
- Quelles sont les meilleures pratiques pour effectuer des conversions explicites lorsque des conversions implicites sont possibles?
Bon point. Cela fonctionne encore mieux avec les méthodes d'extension. –