如果从.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();
这种改变会不会有任何不利因素?
答案 0 :(得分:5)
此更改的一个缺点是编译器无法捕获错别字导致的错误。例如,如果你写了
if (foo.Clone().Equalls(foo)) {
// ^^
// ||
// Here is a typo ==++
}
当您的Clone()
返回object
时,编译器会抓住它。如果更改为dynamic
,编译器就可以正常运行,因此您的程序会为缺少的方法抛出运行时异常。
答案 1 :(得分:3)
是的,一个主要缺点是动态不能提供编译时安全......或者有用的智能感知。因此,不仅需要更长的时间并且更容易出错访问对象的属性,而且如果你确实犯了错误,那么直到运行时才会捕获它。
并非总是如此,但通常可以通过仿制药更好地避免你给出的“冗长”的例子。 ICloneable
是一个接口的示例,由于某种原因(可能是历史性的)没有通用版本,但是当存在通用版本时,它意味着您可以返回所需的确切类型而不是必须的对象被投了。