"动态"类型可以在通用集合<dynamic>中安全地变化吗?

Joe*_*orn 10 .net c# dynamic c#-4.0

基于我对这个问题的回答,我想检查一下我对即将到来dynamic的C#4类型的理解.

在这种情况下,我们有一个集合,表示从未知数据库表中提取的记录中的字段.较旧的代码(pre-.Net 4)需要这样的集合持有类型的项目Object.这样一个集合一旁的优点,我想了解一下,当你改变会发生什么Object来dynamic.

一方面,我希望因为动态类型的东西都在运行时得到解决,只要程序员不对集合中特定项的预期类型进行任何拼写错误或错误,一切都应该没问题.

另一方面,我想知道前一句中的"所有"这个词.运行时是否可能会在第一次访问动态属性时缓存结果,从而导致使用不同类型的后续调用失败?

Eri*_*ert 3

以下是 Sam 博客中的相关内容,简要讨论了缓存策略。

http://blogs.msdn.com/samng/archive/2008/10/29/dynamic-in-c.aspx

DLR 检查缓存以查看给定操作是否已与当前参数集绑定。因此,在我们的示例中,我们将根据 1、2 和 d 的运行时类型进行类型匹配。如果我们有缓存命中,那么我们返回缓存的结果。如果没有缓存命中,则 DLR 会检查接收者是否是 IDynamicObject。这些家伙本质上是知道如何处理自己的绑定的对象,例如 COM IDispatch 对象、真正的动态对象(例如 Ruby 或 Python 对象)或一些实现 IDynamicObject 接口的 .NET 对象。如果是其中任何一个,则 DLR 会呼叫 IDO 并要求其绑定该操作。

请注意,调用 IDO 进行绑定的结果是表示绑定结果的表达式树。如果它不是 IDO,则 DLR 调用语言绑定器(在我们的示例中为 C# 运行时绑定器)来绑定操作。C# 运行时绑定器将绑定操作,并将返回表示绑定结果的表达式树。一旦执行了第 2 步或第 3 步,生成的表达式树就会合并到缓存机制中,以便任何后续调用都可以针对缓存运行,而不是重新调用。

然而,Sam 没有提到缓存未命中策略到底是什么。有两种主要的缓存未命中策略:(1)当参数类型更改时触发缓存未命中,(2)当参数身份更改时触发缓存未命中。

显然前者的性能要好得多;确定何时可以仅根据类型进行缓存是很棘手的。对所有逻辑如何运作的详细解释将需要相当长的时间;希望我或克里斯或山姆有一天能就此发表一篇博客文章。

  • @Joel:当然,缓存未命中策略中可能存在错误。如果你找到了,请告诉我!:) (3认同)