看了很多人讨论Dynamic。不禁自己也想挖掘下。下面把自己的体会分享给大家

1.Dynamic关键字是为了方便访问某个对象。而跟DLR没太大关系。

使用了dynamic关键字创建的对象实际上是一个object. 使用.net 4.0以下的Reflector就可以看到.

使用dynamic关键字后编译器将会将这个对象后面的PropertyName翻译成相应Binder调用。因此语法检查器会忽略检查此对象是否包含PropertyName.

真正的跟DLR有关的是在System.Dynamic下的类型。

大家可以实验一个叫ExpandoObject的东西

private static void Main(string[] args)
{ dynamic expandoObject = new ExpandoObject(); expandoObject.PropertyA = "PropertyA";expandoObject.PropertyB = 2010; Console.WriteLine(expandoObject.PropertyA);Console.WriteLine(expandoObject.PropertyB);
}

这个时候用dynamic是不是有点动态语言的感觉了?所以说 dynamic不是DLR的实现,
但要用DLR在C#里最好的途径可能就是使用dynimic了。

2.Dynamic关键字是一个编译器做的语法糖

 

请看如下代码:

原始代码

 

public class Program{static void Main(string[] args){Method1();Method2();Method3();Method4();}private static void Method1(){dynamic d = new TestClass();d.TestProperty = "";}private static void Method2(){TestClass t = new TestClass();dynamic d1 = t;dynamic d2 = t;d1.TestProperty = "";d2.TestProperty = "";}private static void Method3(){dynamic d = new TestClass();for (int i = 0; i < 100; i++){d.TestProperty = i.ToString();}}private static void Method4(){for (int i = 0; i < 100; i++){dynamic d = new TestClass();d.TestProperty = i.ToString();}}class TestClass{public string TestProperty { get; set; }}

用3.5语法反编译的
其实上面也都说的很清楚了 编译器会把dynamic编译在一个和dynamic所在函数名有关的Static SiteContainer

<Method1>o__SiteContainer0
<Method2>o__SiteContainer2 …等

而且是一个dynamic生成一个Site .装在对应的Container中。

下面我们来看Method1 反编译后

 

private static void Method1()
{object d = new TestClass();if (<Method1>o__SiteContainer0.<>p__Site1 == null){<Method1>o__SiteContainer0.<>p__Site1 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "TestProperty", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) }));}<Method1>o__SiteContainer0.<>p__Site1.Target(<Method1>o__SiteContainer0.<>p__Site1, d, "");
}

可以看出d其实是个Object了访问属性通过Site实现,而且这里的Site判空,意味着可以缓存。

Method2反编译后

private static void Method2()
{TestClass t = new TestClass();object d1 = t;object d2 = t;if (<Method2>o__SiteContainer2.<>p__Site3 == null){<Method2>o__SiteContainer2.<>p__Site3 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "TestProperty", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) }));}<Method2>o__SiteContainer2.<>p__Site3.Target(<Method2>o__SiteContainer2.<>p__Site3, d1, "");if (<Method2>o__SiteContainer2.<>p__Site4 == null){<Method2>o__SiteContainer2.<>p__Site4 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "TestProperty", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) }));}<Method2>o__SiteContainer2.<>p__Site4.Target(<Method2>o__SiteContainer2.<>p__Site4, d2, "");
}虽然 d1 d2 都指向了 同一个对象t.但这里还是创建了两个Site。可见出现了多少个dynamic就会创建多少个site.

再看Method3和Method4
 
private static void Method3(){object d = new TestClass();for (int i = 0; i < 100; i++){if (<Method3>o__SiteContainer5.<>p__Site6 == null){<Method3>o__SiteContainer5.<>p__Site6 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "TestProperty", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null) }));}<Method3>o__SiteContainer5.<>p__Site6.Target(<Method3>o__SiteContainer5.<>p__Site6, d, i.ToString());}}private static void Method4(){for (int i = 0; i < 100; i++){object d = new TestClass();if (<Method4>o__SiteContainer7.<>p__Site8 == null){<Method4>o__SiteContainer7.<>p__Site8 = CallSite<Func<CallSite, object, string, object>>.Create(Binder.SetMember(CSharpBinderFlags.None, "TestProperty", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null) }));}<Method4>o__SiteContainer7.<>p__Site8.Target(<Method4>o__SiteContainer7.<>p__Site8, d, i.ToString());}}

可见dynamic写在循环里和循环外都是一样的。因为编译器只看到一个dynamic。只生成了一个site.由于site一样且经过缓存,
可以猜想性能不会相差太。

3.Dynamic做了会做缓存,加速访问

由于Site和SiteContainer都是Staic的,所以凡是重复对一个dynamic操作多次都会受益于这种cache。眼看要下班了。笔先收一下,有时间再写:-)

转载于:https://www.cnblogs.com/Gerryz/archive/2010/12/14/1905909.html

我也来说说Dynamic相关推荐

  1. ideal如何创建dynamic web project

    步骤如下 ① file -> new -> project ② 选择 Java Enterprise -> next ③ create project from template - ...

  2. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  3. 需要反射时使用dynamic

    //使用dynamic的写法 dynamic fileExplorerData = _currentFolder.FileExplorerData; var data = fileExplorerDa ...

  4. Towards Real-time Semantic RGB-D SLAM in Dynamic Environments(动态语义SLAM)

    动态环境下的实时语义SLAM 简介 摘要 系统流程 实验结果 总结 简介 在ICRA 2021上看到这样一篇论文:Towards Real-time Semantic RGB-D SLAM in Dy ...

  5. ADPRL - 近似动态规划和强化学习 - Note 7 - Approximate Dynamic Programming

    Note 7 - 近似动态规划 Approximate Dynamic Programming 7. 近似动态规划 (Approximate Dynamic Programming) 7.1 近似架构 ...

  6. ADPRL - 近似动态规划和强化学习 - Note 5 - Banach Fixed Point Theorem in Dynamic Programming

    动态规划中的巴拿赫不动点定理 5. Banach Fixed Point Theorem in Dynamic Programming 5.1 巴拿赫不动点定理定理 (Banach fixed poi ...

  7. 强化学习(二)- 动态规划(Dynamic Programming)

    3.动态规划 3.1 介绍 术语动态规划(DP:Dynamic Programming) 指的是一个算法集合,可以用来计算最优策略,给定一个完美的环境模型,作为马尔可夫决策过程(MDP).经典的DP算 ...

  8. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  9. 了解 C# “.NET研究”4 中的 Dynamic 关键字

    dynamic 关键字和动态语言运行时 (DLR) 是 C# 4 和 Microsoft .NET Framework 4 中的重大新增功能. 这些功能在宣布时就引起了人们的极大兴趣,并伴随着许多疑问 ...

  10. 【引用】在Eclipse中将java Project转换成Dynamic Web Project

    编辑工程的.project文件: 添加 <nature>org.eclipse.wst.common.project.facet.core.nature</nature> &l ...

最新文章

  1. Pandas进阶修炼120题,给你深度和广度的船新体验
  2. 【Linux】15.mdc启动网卡并设置其ip和子网掩码
  3. Windows x64内核学习笔记(四)—— 9-9-9-9-12分页
  4. 【C/C++多线程编程之十】pthread线程私有数据
  5. cookie在后台的存取
  6. http报文格式_理解数据通信协议的报文格式有何用?
  7. java熄灯问题_枚举 - bailian 2811:熄灯问题
  8. IT职场的一些处事之道
  9. Visual Studio、.NET Framework、VC++、C#各个版本的对应关系
  10. python图形绘制含注释
  11. python post 上传文件_python接口自动化7-post文件上传
  12. 删库跑路mini版!程序员写代码给自己转账21万!判了~
  13. linux运维故障案列,linux 运维故障排查思路
  14. matlab2012b破解版安装
  15. 【动态任务-七】Spring整合Cron在线生成表达式(基于bootstrap3自适应样式)
  16. 彻底解决 linux 下 buff/cache 占用过高的问题
  17. 判断三角形顺时针/逆时针
  18. paraview热流图(1):添加glyphs
  19. 奇技淫巧玄妙无穷| M1 mac os(苹果/AppleSilicon)系统的基本操作和设置
  20. STM32软件仿真卡住

热门文章

  1. mysql导出html工具类,如何在codeigniter中将csv文件导入MYSQL,其中包含html标签
  2. c++拷贝、赋值和销毁的简单介绍
  3. PHP+MySQL能做什么?
  4. jetson nano 系统镜像制作_参考备份Jetson Nano系统(该程序不完备,制作的image不可用,仅供)...
  5. 机器学习 KNN算法_0 丐版(matlab实现)
  6. ROS中使用Eigen库[不定期更新]
  7. 监管大屏系统_餐饮公示大屏广告位招商正式启动!
  8. java hadoop api,Hadoop API,HadoopAPI
  9. winCVS 使用方法
  10. 洛谷 P1242 新汉诺塔