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

4
我最近参加了Code Camp 12,有位演讲者说C# 4.0中的新关键字dynamic应该仅用于与动态语言的互操作。我想他还说它相对于普通反射来说有点慢(而反射本身也有点慢)。
但是后来我听到Scott Hanselman提到,动态关键字“使反射变得不那么痛苦”。
那么,为了反映一个不来自动态代码的对象,使用动态关键字是否可行?
5个回答

7
我认为“不是”,但不要过度使用它。实际上,根据我的基准测试,dynamic比基本反射更快,因为它保持委托(而不是一直使用反射Invoke)。特别是,有两个优点:
  • 调用泛型方法(MakeGenericMethod等非常痛苦)
  • 调用运算符
然而,有使用接口等方式做你需要的事情;在非动态类型上使用dynamic实际上相当于鸭子类型。这在非常有限的场景中很有用;大多数情况下:接口会更好。但不要排除它们。 dynamic的缺点是,为了有用(不编写疯狂的代码),您需要在编译时知道名称;通常情况下并非如此,否则我们就不会处于这种困境!当您只在运行时知道名称时,有其他选项(ExpressionDelegate.CreateDelegate、"HyperDescriptor"、DynamicMethod等)可以快速访问数据。

4
如果你感觉需要鸭子类型,并且不需要编译时类型安全,请使用dynamic。我相信在仅限于C#的代码中,它将有许多新的用途(例如使用ExpandoObject查询动态数据源,如XML)。但我同样确定大量新用途将是多余的,就像很多泛型的使用只是表达多态性的更复杂的方式一样。
关于性能,.NET 4中的DLR正在试图使动态类型“快速”。与往常一样,当您开始分析应用程序时,您会发现它是否足够快。

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

2
动态关键字是用于互操作性的,但不仅限于动态语言的互操作性。COM互操作性只是其中一个例子。C#团队已经修改了COM互操作性以使用此功能,这使得互操作性更加容易。我最近看到ASP.NET MVC视图正在做类似的事情。
我还发布了一个示例,展示了动态关键字的另一个用例: C# 4.0中的动态:使用DynamicObject创建包装器。这些正是Freed所谈论的类型的示例:简化与XML数据的互操作性。

1

我必须说,“不是的”。看一下http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx,了解一个意想不到的用法示例。

动态关键字显然旨在使COM和动态语言更易于使用,但这并不意味着我们应该将其限制在这些领域。就性能而言:记住它,但在出现性能问题之前不要过分关注它。(这是那些很少影响高级设计选择的较低级别细节之一,这些选择可能会在您开始之前破坏性能。)

编辑

此外,任何优秀的语言设计师都知道人们会以意想不到的方式使用语言功能。这对于本讨论尤为相关,因为他们制作了一个接口,使动态行为成为可能。他们有意允许人们将几乎任何东西连接到“动态”关键字的功能中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接