如何防止c#编译器/CLR在DEBUG构建中优化掉未使用的变量
本文关键字:优化 未使用 变量 构建 DEBUG 何防止 编译器 CLR | 更新日期: 2023-09-27 18:12:02
在调试时,我尝试将计算的中间结果保存到一个变量中,以便在满足断点条件时检查该值。然而,c#编译器(或CLR)将该变量优化为未使用的。我通过使变量成为类的公共字段来解决这个问题,但是我想知道是否有一个直接的解决方案来解决这个问题。
"优化代码"复选框未选中。构建配置为Debug。
编辑:发现它只影响迭代器中一些未使用的变量,这些变量通常会作为自动生成的迭代器类中的字段结束;
延迟选项为....使用值,理想的方式是不允许它被保存在堆栈上。例如:
var tmp = SomeMethod();
// your other code
Debug.WriteLine(tmp);
使用该值作为参数意味着它必须被保留,但该行不会自动编译到发布版本中。
然而!我必须强调,在未优化/调试的构建中几乎总是保留局部变量,所以我发现问题中的场景很难想象。
如果您正在使用Visual Studio,为什么不只是在正在进行计算的行后面添加一个断点,然后您可以简单地将鼠标悬停在计算上以查看智能感知/工具提示弹出的结果?我还认为你可以将计算添加到"watch"屏幕上,并以这种方式查看结果。
这通常是我如何看待我正在调试的东西的结果。或者,您可以使用您以某种简单的方式创建的temp变量来避免收到警告。
例如:Console.Write(tempVariable);
实用工具:
using static _globals;
static class _globals
{
[MethodImpl(MethodImplOptions.NoInlining), DebuggerHidden]
public static void Nop<T>(out T x) => x = default(T);
};
class Program
{
static void Main()
{
int i; // unreferenced variable
/// ...
Nop(out i);
/// ...
}
};
您需要取消选中Debug build项目选项中的"Optimize code"选项
在我的情况下,"优化代码"选项未选中,我仍然面临这个问题。我检查它,构建项目,然后检查它,再构建项目。