c# - 您将如何使用 C# 4 动态类型?

标签 c# dynamic c#-4.0

C# 4 将包含一个新的 dynamic 关键字,它将动态语言特性引入 C#。

你打算如何在你自己的代码中使用它,你会建议什么模式?在您当前项目的哪个部分,它将使您的代码更清晰或更简单,或者使您无法做的事情(除了与 IronRuby 或 IronPython 等动态语言的明显互操作之外)?

PS:如果您不喜欢这个 C# 4 新增功能,请避免发表负面评论。

编辑:重新聚焦问题。

dynamic 的经典用法为大多数 stackoverflow C# 用户所熟知。我想知道的是,您是否想到了特定的新 C# 模式,在这些模式中可以有效地利用动态而不会失去太多 C# 精神。

最佳答案

现在使用老式反射并且代码可读性受到损害的地方。而且,正如您所说,一些 Interop 场景(我偶尔会使用 COM)。

差不多就这些了。如果可以避免使用dynamic,就应该避免使用。编译时检查、性能等

几周前,我想起了this article .当我第一次读到它时,坦率地说,我感到震惊。但我没有意识到的是,我什至不知道如何对某些未知类型使用运算符。我开始想知道生成的代码会是这样的:

dynamic c = 10;
int b = c * c;

使用正则反射,不能使用定义的运算符。它使用 Microsoft 命名空间中的一些内容生成了相当多的代码。我们只是说上面的代码更容易阅读:)它的工作很好,但它也非常慢:比常规乘法 (doh) 慢大约 10,000 倍,大约 100 倍比带有 Multiply 方法的 ICalculator 接口(interface)慢。

编辑 - 生成的代码,对于那些感兴趣的人:

if (<Test>o__SiteContainer0.<>p__Sitea == null)
  <Test>o__SiteContainer0.<>p__Sitea =
    CallSite<Func<CallSite, object, object, object>>.Create(
      new CSharpBinaryOperationBinder(ExpressionType.Multiply,
        false, false, new CSharpArgumentInfo[] {
          new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null),
          new CSharpArgumentInfo(CSharpArgumentInfoFlags.None, null) }));
b = <Test>o__SiteContainer0.<>p__Site9.Target(
      <Test>o__SiteContainer0.<>p__Site9,
      <Test>o__SiteContainer0.<>p__Sitea.Target(
        <Test>o__SiteContainer0.<>p__Sitea, c, c));

关于c# - 您将如何使用 C# 4 动态类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293984/

相关文章:

C#函数作为参数

c# - 如何使用 Visual Studio 2010 将 Windows 控制台应用程序 C# 项目更改为 Windows 服务?

asp.net - OleDb - 检索 Excel 工作表名称也会检索定义的名称

mysql - WPF 表单卡住并从数据库获取数据

c# - 从代码和网站调用Web API

c# - Monotouch EKEvent 注释未保存

c# - WPF : Attaching some data to a Button

javascript - 在 Javascript 书签中动态生成整个页面

c - C 中的动态数组 - 如何使其工作?

c - 动态指针操作 C 编程