接口方法返回动态

本文关键字:动态 返回 方法 接口 | 更新日期: 2023-09-27 18:07:03

如果在。net 4.0版本中,所有接口方法从返回对象变为返回动态,会有什么不利之处吗?

现有的代码将不必因此而改变,因为底层类型仍然是相同的,并且它将使代码稍微不那么冗长。

public class MyClass : IClonable
{
    //...
    public object Clone()
    {
        //...
        return new MyClass(...);
    }
}
MyClass foo = new MyClass(...);
MyClass bar = foo.Clone() as MyClass;
唯一减少上述代码冗长的方法是将foobar的声明更改为var。 现在,如果IClonable.Clone()返回一个动态,底层类(在运行时)仍然是MyClass,但是代码将变得稍微不那么冗长:
MyClass foo = new MyClass(...);
MyClass bar = foo.Clone();

这样的改变有什么不利之处吗?

接口方法返回动态

此更改的一个缺点是编译器无法捕获由拼写错误引起的错误。例如,如果你写

if (foo.Clone().Equalls(foo)) {
//                  ^^
//                  ||
// Here is a typo ==++
}

如果您的Clone()返回object,编译器将捕获它。通过更改dynamic,编译器可以很好地处理它,因此您的程序将为丢失的方法抛出运行时异常。

是的,一个主要的缺点是动态不提供编译时安全性…或者是有用的智能感知。因此,访问对象的属性不仅需要更长的时间,而且更容易出错,而且即使犯了错误,也要到运行时才能发现。

情况并非总是如此,但通常你给出的"冗长"的例子可以通过泛型更好地避免。ICloneable是一个接口的例子,其中由于某种原因(可能是历史上的)没有泛型版本,但是当有泛型版本时,这意味着您可以返回您需要的确切类型,而不是必须强制转换的对象。

相关文章: