动态关键字是否*仅*用于动态语言?

时间:2009-10-26 13:56:17

标签: c# reflection dynamic c#-4.0 dynamic-keyword

我最近参加了Code Camp 12,并且有一位发言者表示C#4.0 中的新dynamic关键字应仅用于与动态语言互操作。我认为他也说过,与正常反射(本身有点慢)相比,它有点慢。

但后来我听到斯科特汉塞尔曼提到动态关键词“使反思不那么痛苦”。

因此,为了反映不是来自动态代码的对象,使用dynamic关键字是否可以接受?

5 个答案:

答案 0 :(得分:7)

我会说“不”,但不要疯狂地开始使用它。实际上,dynamic从我的基准测试开始,比基本反射更快,因为它保留了代理(而不是一直使用反射Invoke)。特别是,有两个优点:

  • 调用泛型方法(MakeGenericMethod等真是太痛苦了)
  • 致电运营商

但是,有一些方法可以通过接口等方式完成所需的操作;关于非动态类型的dynamic实际上相当于鸭子类型。这在非常有限的场景中非常有用;主要是:接口是首选。不要排除它们。

dynamic的缺点是有用(没有编写疯狂的代码),你需要在编译时知道名字;通常情况并非如此,或者我们不会在这个泡菜中!当您仅在运行时知道名称时,还有其他选项(ExpressionDelegate.CreateDelegate,“HyperDescriptor”,DynamicMethod等)以快速方式访问数据。

答案 1 :(得分:4)

如果您觉得需要鸭子打字并且不需要编译时间类型安全,请继续使用动态。我确信它会在C#only代码中出现一些新的用法(例如使用ExpandoObject查询动态数据源,如XML)。我确信大量的新用法将是多余的,同样多地使用泛型只是表达多态性的一种更复杂的方式。

关于性能,.NET 4中的DLR正试图“快速”进行动态类型化。和往常一样,如果它足够快,那么当你开始描述你的应用程序时,你会发现它。

答案 2 :(得分:2)

据我所知,在C#中引入dynamic关键字的主要原因是为了更容易与COM对象进行互操作。但当然,它可以用于反思......

答案 3 :(得分:2)

嗯,答案是动态关键字用于互操作,但不仅适用于动态语言互操作。 COM互操作只是一个例子。 C#团队已经修改了COM互操作以使用此功能,这使得互操作变得更加容易。我最近看到ASP.NET MVC Views正在做类似的事情。

我还发布了一个示例,显示了动态关键字的另一个用例: Dynamic in C# 4.0: Creating Wrappers with DynamicObject。这些正是Freed所讨论的示例类型:简化与XML数据的互操作。

答案 4 :(得分:1)

我不得不说,“不”。请查看http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx,了解使用率较低的示例。

动态关键字显然是为了让COM和动态语言更容易使用,但这并不意味着我们应该将它限制在那些区域。性能方面:记住它,但在遇到性能问题之前不要关注它。 (这是较低级别的细节之一,不太可能影响高级别的设计选择,在您开始之前可能会削弱性能。)

修改

此外,任何优秀的语言设计师都会意识到人们会以意想不到的方式使用语言功能。这与此讨论特别相关,因为它们创建了一个支持动态行为的界面。他们有目的地允许人们将几乎任何东西都挂钩到“动态”关键词功能中。