如何防止c#编译器/CLR在DEBUG构建中优化掉未使用的变量

本文关键字:优化 未使用 变量 构建 DEBUG 何防止 编译器 CLR | 更新日期: 2023-09-27 18:12:02

在调试时,我尝试将计算的中间结果保存到一个变量中,以便在满足断点条件时检查该值。然而,c#编译器(或CLR)将该变量优化为未使用的。我通过使变量成为类的公共字段来解决这个问题,但是我想知道是否有一个直接的解决方案来解决这个问题。

"优化代码"复选框未选中。构建配置为Debug。

编辑:发现它只影响迭代器中一些未使用的变量,这些变量通常会作为自动生成的迭代器类中的字段结束;

如何防止c#编译器/CLR在DEBUG构建中优化掉未使用的变量

在不包含yield语句的块中使用的变量将被保留。

延迟选项为....使用值,理想的方式是不允许它被保存在堆栈上。例如:

 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"选项

在我的情况下,"优化代码"选项未选中,我仍然面临这个问题。我检查它,构建项目,然后检查它,再构建项目。