什么时候应该在c#4.0中使用dynamic关键字?
什么时候应该在c#4.0中使用dynamic关键字?…….在C#4.0中使用dynamic关键字的任何好例子都可以解释它的用法….
只有在不使用dynamic的时候才应该使用它是痛苦的 。 像在MS Office库一样。 在所有其他情况下,应该避免编译types检查是有益的。 以下是使用dynamic的好处。
- 从Silverlight调用JavaScript方法。
- COM互操作。
- 也许读取Xml,Json而不创build自定义类。
这个怎么样? 我一直在寻找的东西,并想知道为什么没有“dynamic”是如此的困难。
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) { /* ... */ } }
你只需要捕捉运行时exception,并处理你想要的方式,如果你没有一个重载的方法,采取具体的types。
正如在这里所描述的,dynamic可以使devise不佳的外部库更易于使用:Microsoft提供了Microsoft.Office.Interop.Excel程序集的示例。 而dynamic的,你可以避免使用这个大会时,很多恼人的,明确的铸造。
另外,与@ user2415376相反,它绝对不是一种处理接口的方法,因为我们已经从语言的开始几天就实现了多态性!
您可以使用
ISomeData specificData = data;
代替
dynamic specificData = data;
另外它将确保您不会传递错误types的数据对象。
检查这个博客文章,谈论在C#中的dynamic关键字: https : //cloudncode.blog/2016/07/12/c-dynamic-keyword-what-why-when/
这里的要点是:dynamic关键字确实是强大的,它与dynamic语言一起使用时是不可替代的,但是在devise静态types对象根本不会做的代码时也可以用于棘手的情况。
考虑一下缺点:1.没有编译时types检查,这意味着除非你对unit testing有100%的信心(咳嗽),否则你将面临风险。
-
如果性能对您的项目来说很重要(通常是)不使用dynamic的话,那么dynamic关键字使用更多的CPU周期比您的老式的静态types代码更多的运行时间开销。
-
常见的错误包括在public方法中返回封装在dynamic关键字中的匿名types。 匿名types是特定于程序集,通过程序集(通过公共方法)返回它们会引发错误,即使简单的testing会抓住这一点,你现在有一个公共的方法,你只能从特定的地方使用,这只是不好的devise。
-
这是一个滑坡,缺乏经验的开发人员痒痒地写一些新的东西,并尽力避免更多的类(这不一定限于没有经验的)将开始使用dynamic越来越多,如果他们在代码中看到它,通常我会做一个代码分析检查dynamic/添加代码审查。
在所有可以使用的情况下使用dynamic显然是一个坏主意。 这是因为你的程序会失去编译时检查的好处,而且速度也会变慢。
我想复制代码项目文章的摘录,其定义如下:
为什么使用dynamic?
在静态types的世界里,dynamic的给开发人员提供了很多绳索。 处理编译时可以知道types的对象时,应该不惜一切代价避免dynamic关键字。 早些时候,我说我最初的反应是消极的,那么改变了我的想法呢? 引用玛格丽特·阿特伍德的话来说, 静态打字时,dynamic不会形成有意义的针迹。 如果您正在处理未知或dynamictypes,通常需要通过reflection与它进行通信。 reflection代码不容易阅读,并具有上述dynamictypes的所有缺陷。 在这种情况下,dynamic变得很有意义。[更多]
虽然Dynamic关键字的一些特征是:
- dynamictypes – 这意味着声明的variablestypes是由编译器在运行时决定的。
- 申报时无需进行初始化。
例如,
dynamic str; str=”I am a string”; //Works fine and compiles str=2; //Works fine and compiles
-
错误在运行时被捕获
-
智能感知不可用,因为types及其相关的方法和属性只能在运行时才知道。 [ https://www.codeproject.com/Tips/460614/Difference-between-var-and-dynamic-in-Csharp%5D