动态关键字是否“仅”与动态语言一起使用?
-
06-07-2019 - |
题
我最近参加了 Code Camp 12,那里的一位演讲者说,新的 dynamic
C# 4.0 中的关键字 应该 仅用于与动态语言互操作。我认为他还说过,与正常反射(本身有点慢)相比,它有点慢。
但后来我听到 Scott Hanselman 提到动态关键字“让反思不那么痛苦”。
那么使用dynamic关键字来反映不是来自动态代码的对象是可以接受的吗?
解决方案
我会说“不”,但不要开始疯狂地使用它。实际上, dynamic
根据我的基准测试, 快点 比基本反射,因为它保持委托(而不是使用反射 Invoke
每时每刻)。具体而言,有两个优势:
- 调用泛型方法(
MakeGenericMethod
等等真是太痛苦了) - 呼叫接线员
然而,有一些方法可以通过接口等来完成您需要的操作; dynamic
在非动态类型上实际上相当于鸭子类型。这在以下情况下很有用: 非常有限 一组场景;大多:接口将是首选。不要排除它们。
缺点是 dynamic
为了有用(不编写疯狂的代码),您需要在编译时知道名称;但事实往往并非如此,否则我们就不会陷入困境!当您在运行时只知道名称时,还有其他选项(Expression
, Delegate.CreateDelegate
, "超级描述符", DynamicMethod
, 等)以快速方式访问数据。
其他提示
如果您觉得需要鸭子打字并且不需要编译时间类型安全,请继续使用动态。我确信在C#only代码中会出现一些新的用法(例如使用ExpandoObject查询XML等动态数据源)。我确信大量的新用法将是多余的,同样多地使用泛型只是表达多态性的一种更复杂的方式。
关于性能,.NET 4中的DLR正试图使“动态”键入“快速”。和往常一样,如果它足够快,那么当你开始描述你的应用程序时,你会发现它。
据我所知,在C#中引入 dynamic
关键字的主要原因是为了更容易与COM对象进行互操作。但当然,它可以用于反思......
嗯,答案是动态关键字用于互操作,但不仅适用于动态语言互操作。 COM互操作只是一个例子。 C#团队已经修改了COM互操作以使用此功能,这使得互操作变得更加容易。我最近看到ASP.NET MVC Views正在做类似的事情。
我还发布了一个示例,显示了动态关键字的另一个用例: C#4.0中的动态:使用DynamicObject创建包装器。这些正是Freed所讨论的示例类型:简化与XML数据的互操作。
我不得不说,“不”。请查看 http://haacked.com/ archive / 2009/08/26 / method-missing-csharp-4.aspx ,以获得较少预期的使用示例。
动态关键字显然是为了让COM和动态语言更容易使用,但这并不意味着我们应该将它限制在那些区域。性能方面:记住它,但在遇到性能问题之前不要关注它。 (这是较低级别的细节之一,不太可能影响高级别的设计选择,在您开始之前可能会削弱性能。)
修改强>
此外,任何优秀的语言设计师都会意识到人们会以意想不到的方式使用语言功能。这与此讨论特别相关,因为它们创建了一个支持动态行为的界面。他们有目的地允许人们将任何东西挂钩到“动态”的东西中。关键词功能。