Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止C#编译器/CLR优化调试构建中未使用的变量?_C#_Debugging - Fatal编程技术网

如何防止C#编译器/CLR优化调试构建中未使用的变量?

如何防止C#编译器/CLR优化调试构建中未使用的变量?,c#,debugging,C#,Debugging,调试时,我试图将计算的中间结果保存到变量中,以便在满足断点条件时检查该值。然而,C#编译器(或CLR)优化后将该变量作为未使用的变量。我通过使变量成为类的公共字段解决了这个问题,但是我想知道是否有一个简单的解决方案 未选中“优化代码”复选框。生成配置为调试 Edit:发现它只影响迭代器中一些未使用的变量,这些变量通常会在自动生成的迭代器类中作为字段结束;在不包含yield语句的块中范围内的未使用变量将被保留。您需要在调试生成的项目选项中取消选中选项“优化代码”。延迟选项将是。。。。理想情况下,使

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

未选中“优化代码”复选框。生成配置为调试


Edit:发现它只影响迭代器中一些未使用的变量,这些变量通常会在自动生成的迭代器类中作为字段结束;在不包含yield语句的块中范围内的未使用变量将被保留。

您需要在调试生成的项目选项中取消选中选项“优化代码”。

延迟选项将是。。。。理想情况下,使用该值时不要将其保留在堆栈上。例如:

 var tmp = SomeMethod();
 // your other code
 Debug.WriteLine(tmp);
Console.Write(tempVariable);
将该值用作参数意味着必须保留该值,但该行不会自动编译到发布版本中


然而!我必须强调,在未优化/调试的构建中,局部变量几乎总是被保留的,因此我发现这个问题中的场景很难想象。

如果您使用的是Visual Studio,为什么不在进行计算的行后面的行上添加一个断点呢,然后您只需将鼠标悬停在计算上,即可在intellisense/工具提示弹出窗口中查看结果?我还认为,您可以将计算添加到“监视”屏幕,并以这种方式查看结果

这通常是我查看调试结果的方式。或者,您可以使用以某种简单方式创建的temp变量来避免收到警告

例如:

 var tmp = SomeMethod();
 // your other code
 Debug.WriteLine(tmp);
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);

        /// ...
    }
};
使用静态全局变量;
静态类_全局
{
[MethodImpl(MethodImplOptions.noInLine),DebuggerHidden]
公共静态无效Nop(out T x)=>x=默认值(T);
};
班级计划
{
静态void Main()
{
int i;//未引用变量
/// ...
否(i);;
/// ...
}
};

您是否有特定的场景?局部变量通常保留在调试生成中。另外:您(确切地说)在这里使用哪种编译器?编译器是C#4(VS2010,目标框架4.0),但是我刚刚做了一些测试,可以确认在调试构建中保留了局部变量,但在迭代器中除外,这是我的情况。“迭代器”是我们当时缺少的关键细节。。。事实上,他们经历了大规模的重写;我怀疑添加类似于
WriteLine
的内容是通过咀嚼过程保留它们的最佳方式是的,但不可能从一开始就提供所有相关细节,因为通常不清楚哪些细节是相关的。你的评论确实为我指明了正确的方向;p问题中的“优化代码”复选框未选中。构建配置是调试的。它是在我的回答之后添加的。您可以看到我没有编辑这个问题。这句话从一开始就在那儿。@srgstm实际上,我们真的看不到这一点-有一个5分钟的宽限期,不跟踪编辑
控制台的一个缺点是,如果您忘记删除它,它将保留在发布版本中。我不能更早地设置断点,因为断点是有条件的,条件将在代码中稍后计算。@MarcGravel我同意,这就是为什么我建议首先使用断点。我想如果他选择使用实际使用temp变量的解决方案,那么您的方式(使用调试)是一个更好的选择。@srgstm我真的不明白您为什么不能设置断点。你试过这样做吗?也许如果你发布一段代码,我可以帮你多一点……@giygas73他不是在想象;该场景(请参阅注释)是一个迭代器块:我已选中、保存了解决方案、未选中并再次保存。您正在将变量设置为其默认值,因此应调用该变量,例如
SetDefault()
,而不是
Nop()