表达式树 java_Linq表达式树编译非平凡的对象常量,并以某种方式引用它们

这篇博客探讨了一段涉及编译表达式树的代码,该代码中局部变量a在方法外部仍然可以被访问并修改其字段值。通过分析IL代码,作者发现即使在方法执行完毕后,局部变量依然能影响程序行为,挑战了传统的关于栈上变量生命周期的认知。博客揭示了表达式树在编译和运行时的复杂性,以及可能存在的隐藏背景。
摘要由CSDN通过智能技术生成

通常,在编译表达式树时,我会想到不是基元类型或字符串的常量是不可能的 . 但是,这段代码:

public class A

{ public int mint = -1; }

public static void Main(String[] pArgs)

{

//Run(pArgs);

Action pact = Thing();

pact();

}

public static Action Thing()

{

var a = new A();

a.mint = -1;

LambdaExpression p =

Expression.Lambda(Expression.Assign(Expression.Field(Expression.Constant(a, typeof(A)), Strong.Instance.Field(b => b.mint)), Expression.Constant(3, typeof(int))));

return ((Expression)p).Compile();

}

不仅编译,而且实际运行!如果在Thing()方法中运行已编译的方法,那么实际上可以看到变量a将其字段从-1更改为3

我不明白这是否有意义/是可能的 . 方法如何引用其范围之外的局部变量(当检查Thing()的IL时,变量a只是一个标准的局部变量,而不是像堆上的那样在堆上) . 周围是否有某种隐藏的背景?当局部变量a可能已从堆栈中移除时,如何在Main中运行pact!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值