什么是动态关键字的实际动手用法?
dynamic a = 1;
a.Crash();
我知道在XML链中它更具可读性的情况,但除此之外,它有什么好处?
什么是动态关键字的实际动手用法?
dynamic a = 1;
a.Crash();
我知道在XML链中它更具可读性的情况,但除此之外,它有什么好处?
这里的好文章:
作为开发人员,您使用动态 关键字预计将 变量包含这样 为对象从COM或DOM API 返回不确定类型的对象;从动态语言 (例如IronRuby)获得;来自 的反思;从构建的对象 动态在C#4.0中使用新的 扩展功能。
+1。好文章。特别是关于'var vs. dynamic',因为很多人认为他们是一样的。 – 2011-06-14 17:02:47
DLR(动态语言运行时)基本上使每个人都可以与每个人交谈。这不仅包括Python和Ruby,还包括Silverlight,Office/COM等。
这也是一个很好的阅读http://www.hanselman.com/blog/C4AndTheDynamicKeywordWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx – BentOnCoding 2011-06-14 17:00:50
C#'dynamic' keyword!= DLR。 – delnan 2011-06-14 17:01:23
克里斯提到它在COM互操作场景中非常有用。
另外,它对asp.net-mvc-3非常有用。您可以通过动态模型获得视图。你也有ViewBag
对象,可以容纳任何东西。
另一个用途是举行json
object, if you implement a DynamicObject
class。在使用API时,这是非常有用。
我一直在MVC视图模型使用的动态颇为失望。它非常容易受伤。你不能传递到动态扩展方法,这意味着你需要将其转换为已知类型的方法的HtmlHelper使用,并且当它们被编译为内部不能传递匿名类型为动态视图。这是听起来不错的东西之一 - 但实际上并非如此。 – 2011-06-14 17:09:11
@詹姆斯测试一个匿名对象和真的不起作用。我记得另一个用于动态的应用,并补充说。 – BrunoLM 2011-06-14 17:19:54
我发现最实际的用途是处理COM互操作场景。许多传统COM组件最终生成的签名无法通过托管代码进行大量投射,原因是许多项目被编组为object
。它导致如下代码。
IUser GetAUser() { ... }
IUser user = GetAUser();
IAddress address = (IAddress)user.GetAddress();
int zipCode = (int)address.GetZipCode();
对于深层嵌套的层次结构,情况会变得更糟。虽然这段代码是类型安全的,但它并没有违反任何CLR规则,但它是不安全的,因为开发人员依赖于类型的实现细节来完成工作。它并不比动态等价物更安全。
dynamic GetAUser() { ... }
int zipCode = (int)GetAUser().GetAddress().GetZipCode();
不示例代码动态版本违反“两点”禁止写入COM-互操作代码(即生成的代码“隐藏”的RCW)? – 2013-09-03 21:09:35
当您有几个方法重载并且您已将该参数作为对象接收时,对POCO使用dynamic关键字可能非常有用。将参数强制转换为动态参数,它将根据运行时类型解析正确的重载 - 没有动态的情况下最终会产生一系列if/elseif语句,yuck。
使用与DynamicObjects子类的动态关键字可以让你摆脱锅炉板,更容易写出流畅的API和创建代码,是迄今为止更具延展性。例如,这里是一个动态api,摆脱了与MVVM绑定有关的大量样板代码http://code.google.com/p/impromptu-interface/wiki/UsageMVVM
http://msdn.microsoft.com/en-us/library/dd264736.aspx – 2011-06-14 16:58:38