Joe*_*orn 10 .net c# dynamic c#-4.0
基于我对这个问题的回答,我想检查一下我对即将到来dynamic的C#4类型的理解.
在这种情况下,我们有一个集合,表示从未知数据库表中提取的记录中的字段.较旧的代码(pre-.Net 4)需要这样的集合持有类型的项目Object.这样一个集合一旁的优点,我想了解一下,当你改变会发生什么Object来dynamic.
一方面,我希望因为动态类型的东西都在运行时得到解决,只要程序员不对集合中特定项的预期类型进行任何拼写错误或错误,一切都应该没问题.
另一方面,我想知道前一句中的"所有"这个词.运行时是否可能会在第一次访问动态属性时缓存结果,从而导致使用不同类型的后续调用失败?
以下是 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)当参数身份更改时触发缓存未命中。
显然前者的性能要好得多;确定何时可以仅根据类型进行缓存是很棘手的。对所有逻辑如何运作的详细解释将需要相当长的时间;希望我或克里斯或山姆有一天能就此发表一篇博客文章。
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |