一文带你了解 C# DLR 的世界(DLR 探秘)

2020-02-22 21:57:46刘景俊

public void DynamicMethod(Foo f) {
 dynamic d = f;
 d.DoSomething();
}
// 以下是DLR会生成大概的代码
static DynamicCallSite fooCallSite;
public void ReflectionMethod(Foo f) {
 object d = f;
 if(fooCallSite == null) fooCallSite = new DynamicCallSite();
 fooCallSite.Invoke("Foo",d);
}

编译器在编译上述方法DynamicMethod时,会询问一次这个调用点调用的方法的类型是否是同一个,如果是则直接将已经准备好的调用点 fooCallSite 进行调用,否则则像文章之前说的,会生成调用点,绑定器绑定成员信息,根据AST将表达式生成表达式树,将这些都缓存下来。在进行计算(调用)。

正因为我们知道了DLR的一些内幕,所以我们自然也知道了注意该如何用 DLR,以及关键字 dynamic。比如我们现在知道了C#编译器会将 dynamic 等同 object 对待。那么我们在使用的时候一定要注意不要被“莫名其妙”的被装箱了,导致不必要的性能损失了。

至于 DLR 的应用,特别是结合动态语言进行编程,来达到静态语言动态编程的目的。其实DLR刚出来之际,就有了如 IronPython 这样的开源组件。这是另外一个话题,并且我们在做实际应用的情况也很少,所以就没有展开来讲了。

补充:

DLR主要提供以下三个功能:

1.语言实现服务提供语言的互操作性

2.动态语言运行时服务提供动态调用支持

3.公共脚本宿主

依托这些模块,您可以非常轻松的做下面这些事

1.为您现有的.NET应用程序,加入脚本支持

2.为您现有的语言,提供动态知己

3.为任何对象提供动态操作支持

4.在您的架构中提供脚本语言.

参数资料:

https://www.codeproject.com/Articles/42997/NET-4-0-FAQ-Part-1-The-DLR《深入理解C#》

到此这篇关于一文带你了解 C# DLR 的世界的文章就介绍到这了,更多相关C# DLR 内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!