动态关键字的实际用法是什么?
dynamic a = 1;
a.Crash();
我知道在XML链中它更具可读性的情况,但除此之外,它有什么用?
答案 0 :(得分:4)
这是一篇好文章:
作为开发人员,您使用动态 预期变量的关键字 包含不确定类型的对象 作为从COM或DOM返回的对象 API;从动态语言中获得 (例如IronRuby);从 反射;来自建造的物体 使用new在C#4.0中动态生成 扩展能力。
答案 1 :(得分:2)
它在COM互操作场景中特别有用,您通常需要编写大量互操作管道代码。
答案 2 :(得分:1)
我发现最实际的用途是处理COM互操作方案。由于许多项目被封送为object
,许多遗留的COM组件最终会生成无法从托管代码中使用的签名而无需大量的转换。它导致代码如下。
IUser GetAUser() { ... }
IUser user = GetAUser();
IAddress address = (IAddress)user.GetAddress();
int zipCode = (int)address.GetZipCode();
深度嵌套的层次结构会变得更糟。虽然这个代码是安全类型的,因为它不违反任何CLR规则,但是开发人员依赖于类型的实现细节以完成工作的意义上是不安全的。它实际上并不比动态等效物更安全。
dynamic GetAUser() { ... }
int zipCode = (int)GetAUser().GetAddress().GetZipCode();
答案 3 :(得分:0)
DLR(动态语言运行时)基本上使每个人都能与每个人交谈。这不仅包括Python和Ruby,还包括Silverlight,Office / COM等。
答案 4 :(得分:0)
正如Chris所说,它在COM互操作方案中非常有用。
此外,它在asp.net-mvc-3上非常有用。您可以使用动态模型获得视图。你也有ViewBag
对象可以容纳任何东西。
另一个用途是持有json
object, if you implement a DynamicObject
class。使用API时,这非常有用
答案 5 :(得分:0)
当您有多个方法重载并且您已将参数作为对象接收时,将动态关键字与POCO一起使用会非常有用。将参数转换为动态,它将根据运行时类型解决正确的重载 - 没有动态的结果是一系列if / elseif语句,很糟糕。
在DynamicObjects子类中使用dynamic关键字可以让你摆脱锅炉板,更轻松地编写流畅的api,并创建更具延展性的代码。例如,这里是一个动态api,摆脱了大量与MVVM绑定相关的样板代码http://code.google.com/p/impromptu-interface/wiki/UsageMVVM