c# – DLR表达式中的“代码作为数据”在哪里?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – DLR表达式中的“代码作为数据”在哪里?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1628字,纯文字阅读大概需要3分钟。
内容图文
![c# – DLR表达式中的“代码作为数据”在哪里?](/upload/InfoBanner/zyjiaocheng/798/6f4dd36c8f4a4dfd90d0b5ceb8168ba3.jpg)
我有这个c#代码:
Console.Writeline("Hello World");
如果我想用DLR表达式执行此操作,它看起来像这样:
MethodInfo method = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) });
Expression callExpression = Expression.Call(null, method, Expression.Constant("Hello World"));
Action callDelegate = Expression.Lambda<Action>(callExpression).Compile();
callDelegate();
我从.NET 4中的Pro DLR一书中选择了这个例子.我不明白我们为什么要做这项额外的工作? Book说原因是一旦代码在内存中表示为对象,它就比IL指令更容易分析.
最让我困惑的是:
如果我在我的代码中放入DLR表达式而不是ConsoleWriteline()方法并运行我的控制台应用程序,我将得到相同的.exe文件(包含CIL代码),我将在控制台中写入“Hello world”. exe文件正在执行.所以在这两种情况下我都会得到执行的.exe文件(cil代码),我无法看到那些在运行时将代码表示为数据的对象在哪里以及如何访问它们?
解决方法:
基本上,第二个代码片段正在做的是将调用封装为表达式树.表达式树对于.NET来说是相对较新的(它们是使用除内存中对象之外的数据机制实现Linq互操作所必需的),并且以可变但仍可执行的形式封装程序指令.
如果需要,一旦有了表达式,就可以通过更改Call节点引用的Constant节点的值,将要从“Hello World”输出的文本更改为“Hello Dolly”.您可以更改Call节点以使用不同的MethodInfo,例如调用Debug.WriteLine()或您开发的自定义WriteToLog()方法.你也可以传递那个表达式,保存它,序列化它,并且比这个简单的例子更进一步调用它.所有这些更改和决策都可以在运行时根据编译时未知的信息进行.可以基于文件或数据库中的数据创建动态构造的表达式树,其易于更改并且不需要释放包含该行的DLL或EXE的新版本.
相比之下,对Console.WriteLine()的“静态”调用只能在编译时更改(尽管可能会出现一些非常混乱的IL发射动态代码),如果要求写入该字符串的位置,则需要进行此类更改更改.
内容总结
以上是互联网集市为您收集整理的c# – DLR表达式中的“代码作为数据”在哪里?全部内容,希望文章能够帮你解决c# – DLR表达式中的“代码作为数据”在哪里?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。