当我在 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());
}
}
因为编译器知道实现我假设隐式转换比显式转换更好,因为稍后对声明的更改MyType
将导致编译错误而不是运行时错误。但是,我更喜欢显式强制转换语法的简单性,并且经常看到它在其他人的代码中使用。IMyType
MyType
InvalidCastException
我的问题有三个:
- 您更喜欢上述哪个选项(以及为什么)?
- 有一个更好的方法吗?
- 当可以进行隐式转换时,关于执行显式转换的最佳实践是什么?