接口方法返回动态
本文关键字:动态 返回 方法 接口 | 更新日期: 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;
唯一减少上述代码冗长的方法是将foo和bar的声明更改为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
是一个接口的例子,其中由于某种原因(可能是历史上的)没有泛型版本,但是当有泛型版本时,这意味着您可以返回您需要的确切类型,而不是必须强制转换的对象。