gpt4 book ai didi

c# - DLR 表达式中的 "code as data"在哪里?

转载 作者:太空狗 更新时间:2023-10-30 01:10:07 25 4
gpt4 key购买 nike

我有这个 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 一书中获取了这个示例。我不明白为什么我们要做这些额外的工作?书上说原因是一旦代码在内存中表示为对象,它比 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 表达式中的 "code as data"在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com