【问题标题】:Why methods in DynamicObject class are not generic?为什么 DynamicObject 类中的方法不是通用的?
【发布时间】:2011-07-15 14:26:37
【问题描述】:

我正在阅读 this 关于C# 4.0 中的动态对象的文章。
在该示例中,函数 TryGetMember(GetMemberBinder binder, out object result) 的第二个参数是 Object 类型。我查看了MSDN 并注意到其他方法也将参数作为对象获取。为什么这些函数不通用?
来自MSDN

对于简单的分配,装箱和拆箱是 计算成本高的过程

如果装箱/拆箱成本很高,那么使用泛型不是更好吗?

谢谢。

【问题讨论】:

  • 你认为TryGetMember 的调用者多久知道他们会得到什么类型?

标签: c# .net generics dynamic


【解决方案1】:

请注意“关于简单分配”。换句话说,与最便宜的操作之一相比,拳击是昂贵的。

与其他涉及动态类型的机器相比,装箱很便宜:)

如果TryGetMember 是通用的,这意味着调用者 必须知道预期的类型。动态类型的要点之一是调用者不能保证会发生什么。如果我写:

dynamic foo = GetDynamicValueFromSomewhere();
Console.WriteLine(foo.SomeProperty);

这只会解决Console.WriteLine 的哪个重载 SomeProperty 被评估后使用。它没有“预期的”返回类型...那么您希望使用什么泛型类型参数?

请记住,无论如何,大多数动态类型化场景都将使用object 作为 CLR 中的中间表达式类型。如果我写:

dynamic x = 10;

那是已经拳击了。您不能在 CLR 中表示“不确定类型的未装箱值类型”。 (它会分配多少空间?)

【讨论】:

  • @OP: 不仅调用者不能保证类型,动态类型的目的是调用者不关心返回类型是什么,如只要它有SomeProperty 属性。没有指定类型必须是 value 或 ref 类型,因此直到运行时才知道装箱操作的存在。
  • 即便如此,装箱的性能损失实际上并不是分配,而是分配的副作用。称这是一个紧密的循环,您的第 0 代收集频率上升,这可能会导致对第 1 代的更多促销,这反过来可能会增加第 2 代收集的可能性。如果 API 有某种类型的值类型结构返回类型的超集,我会更高兴。像旧的 VARIANT 但不是联合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多