2009-10-26 63 views
4

我最近参加了Code Camp 12,那里有一位演讲者说C#4.0中新的dynamic关键字应该只能用于与动态语言交互。我认为他还表示,与正常反思相比(这本身有点慢),它有点慢。动态关键字是否仅用于动态语言?

但后来我听说Scott Hanselman提到动态关键字“使反射不那么痛苦”。

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

回答

7

我会说“不”,但不要开始疯狂地使用它。实际上,dynamic是,从我已经基准,更快比基本反思,因为它保留代表(而不是使用反射Invoke所有的时间)。特别是,两种方法的长处是:

  • 调用到通用的方法(MakeGenericMethod等就是这么痛苦)
  • 呼吁运营商

不过,也有使用,你需要用接口等做什么办法;在非动态类型上的dynamic实际上相当于鸭子打字。这在非常有限的一组场景中很有用;主要是:接口将是首选。不要排除他们。

dynamic的缺点是有用的(不写疯狂的代码),你需要知道在编译时的名称;往往不是这样,或者我们不会在这个泡菜!当您只在运行时知道名称时,有其他选项(Expression,Delegate.CreateDelegate,“HyperDescriptor”,DynamicMethod等)以快速方式访问数据。

4

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

关于性能,.NET 4中的DLR正试图使动态类型“快速”。与往常一样,如果速度够快,那么当您开始分析应用程序时,您会发现这些东西。

2

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

1

我不得不说,“不”。请看http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx以获得较少预期用途的示例。

动态关键字显然是为了使COM和动态语言更易于使用,但这并不意味着我们应该将它限制在这些区域。就性能而言:记住它,但在出现性能问题之前不要关注它。 (这是那些低级别的细节是不太可能影响到高层次的设计选择,可以削弱的表现,你甚至开始前一个。)

编辑

此外,任何良好的语言设计者是知道的人们会以意想不到的方式使用语言功能。这与本次讨论特别相关,因为他们提供了一个能够实现动态行为的界面。他们有目的地允许人们将任何东西都吸引到“动态”关键字功能中。

2

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

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