首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能确定这个临时变量不会被优化掉吗?

我能确定这个临时变量不会被优化掉吗?
EN

Stack Overflow用户
提问于 2012-02-13 23:48:30
回答 4查看 124关注 0票数 0

我的系统在一个工作线程上发生了一些事情。假设状态发生了变化。我想在UI线程中处理新的状态,所以我分派了一个委托在那里调用:

代码语言:javascript
复制
var state = GetState();
Dispatcher.BeginInvoke(() => StateChanged(state));

StateChanged在UI线程上执行时,我能确保参数state的值是GetState() 在调度之前返回的值吗?还是会对临时state变量进行优化,以便在UI线程上调用GetState()来填充StateChanged参数?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-14 00:37:46

然后,我可以确定参数状态的值是由

()在调度之前返回的值,或者临时状态变量将被优化>清除

没有state不会被优化掉。然而,之前实际上是这个问题的棘手部分。只要您不改变状态变量后的(在同一范围内),您就没有什么可担心的了。

代码语言:javascript
复制
{
 // say GetState returns 2
 var state = GetState(); 
 // state now = 2
 Dispatcher.BeginInvoke(() => StateChanged(state)); 
 state = 3; 
}

在上面的代码中,state不会被优化掉。但是,这并不意味着将以值2调用StateChanged。如果工作线程在启动dispatcher线程之前完成执行,那么它可以是3。

这里的要点是,变量捕获确保值被保留下来供闭包使用,但这并不意味着该值是不可变的。

票数 1
EN

Stack Overflow用户

发布于 2012-02-13 23:51:23

不,肯定会在工作线程上调用GetState。在lambda表达式中移动GetState()调用的“优化”将完全无效。

票数 4
EN

Stack Overflow用户

发布于 2012-02-13 23:57:15

这不会发生,因为它将改变操作的语义,因此不允许进行优化;您可以通过调用方法对变量进行赋值,因此由于C#不是一种懒惰的语言,因此必须在此时进行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9269804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档