Ami*_*abh 38
仅在不使用动态时才应使用动态是痛苦的.就像在MS Office库中一样.在所有其他情况下,应该避免它,因为编译类型检查是有益的.以下是使用动态的好情况.
use*_*376 11
这个怎么样?我一直在寻找的东西,并想知道为什么没有"动态"这么难.
interface ISomeData {}
class SomeActualData : ISomeData {}
class SomeOtherData : ISomeData {}
interface ISomeInterface
{
void DoSomething(ISomeData data);
}
class SomeImplementation : ISomeInterface
{
public void DoSomething(ISomeData data)
{
dynamic specificData = data;
HandleThis( specificData );
}
private void HandleThis(SomeActualData data)
{ /* ... */ }
private void HandleThis(SomeOtherData data)
{ /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
如果没有采用具体类型的重载方法,您可能必须捕获Runtime异常并处理您想要的方式.
相当于不使用dynamic将是:
public void DoSomething(ISomeData data)
{
if(data is SomeActualData)
HandleThis( (SomeActualData) data);
else if(data is SomeOtherData)
HandleThis( (SomeOtherData) data);
...
else
throw new SomeRuntimeException();
}
Run Code Online (Sandbox Code Playgroud)
作为描述这里的动态可以使设计拙劣的外部库更容易使用:微软提供的Microsoft.Office.Interop.Excel的例子组装。使用动态,您可以避免使用此装配体时产生很多烦人的显式转换。
另外,与@ user2415376相对,它绝对不是一种处理接口的方法,因为从语言的开始我们就已经实现了多态性!
您可以使用
ISomeData specificData = data;
Run Code Online (Sandbox Code Playgroud)
代替
dynamic specificData = data;
Run Code Online (Sandbox Code Playgroud)
另外,它将确保您不会传递错误类型的数据对象。
查看这篇博客文章,其中讨论了 c# 中的动态关键字。这是要点:
dynamic 关键字确实很强大,当与动态语言一起使用时它是不可替代的,但也可以用于设计静态类型对象根本无法执行的代码时的棘手情况。
考虑缺点:
没有编译时类型检查,这意味着除非您对单元测试(咳嗽)有 100% 的信心,否则您将面临风险。
由于额外的运行时开销,dynamic 关键字比旧式静态类型代码使用更多的 CPU 周期,如果性能对您的项目很重要(通常是),请不要使用动态。
常见错误包括在公共方法中返回包裹在 dynamic 关键字中的匿名类型。匿名类型特定于程序集,跨程序集返回它们(通过公共方法)会抛出错误,即使简单的测试会捕捉到这一点,你现在有一个只能在特定地方使用的公共方法,这只是糟糕的设计.
这是一个滑坡,没有经验的开发人员渴望写一些新的东西并尽力避免更多的类(这不一定限于没有经验的人)如果他们在代码中看到它会越来越多地使用动态,通常我会做一个代码分析检查动态/在代码审查中添加它。