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

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

未选中“优化代码”复选框。 构建配置是Debug。

编辑:发现它只影响迭代器中一些未使用的变量,这些变量通常最终会作为自动生成的迭代器类中的字段; 保留在不包含yield语句的块中作用域的未使用变量。

懒惰选项将…. 使用该值 ,理想情况是以不允许它保持在堆栈上的方式。 例如:

  var tmp = SomeMethod(); // your other code Debug.WriteLine(tmp); 

使用值作为参数意味着必须保留它,但该行自动不会编译为发布版本。

然而! 我必须强调的是,本地人几乎总是保留在未经优化/调试的版本中,所以我从难以想象的问题中找到了这个场景。

如果您使用的是Visual Studio,为什么不在生成计算的行后面的行上添加断点,然后您可以将鼠标hover在计算上以在intellisense / tooltip弹出窗口中查看结果? 我还认为您可以将计算添加到“监视”屏幕并以此方式查看结果。

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

例如:

 Console.Write(tempVariable); 

方便实用:

 using static _globals; static class _globals { [MethodImpl(MethodImplOptions.NoInlining), DebuggerHidden] public static void Nop(out T x) => x = default(T); }; class Program { static void Main() { int i; // unreferenced variable /// ... Nop(out i); /// ... } }; 

您需要取消选中Debug build的项目选项中的“优化代码”选项。

在我的情况下,“优化代码”选项未经检查,我仍然面临着这个问题。 我检查了它,构建项目然后取消选中它并再次启用项目。 这对我来说是个问题。