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/