C# 启用优化时DotNet不正确的代码步进

C# 启用优化时DotNet不正确的代码步进,c#,debugging,optimization,visual-studio-2015,C#,Debugging,Optimization,Visual Studio 2015,我遇到过这样一种情况:当打开优化(即在发布模式下)时,c#编译器正在做一些奇怪的事情,而您开始单步执行代码(禁用“仅启用我的代码”) 我有类似于下面的代码,它所做的基本上是查看设置提供程序是否有它想要设置的应用程序环境,否则它会将环境单独保留 var environmentValue = settingsProvider.ApplicationEnvironment; if (!string.IsNullOrWhiteSpace(environmentValue)) { switch (

我遇到过这样一种情况:当打开优化(即在发布模式下)时,c#编译器正在做一些奇怪的事情,而您开始单步执行代码(禁用“仅启用我的代码”)

我有类似于下面的代码,它所做的基本上是查看设置提供程序是否有它想要设置的应用程序环境,否则它会将环境单独保留

var environmentValue = settingsProvider.ApplicationEnvironment;
if (!string.IsNullOrWhiteSpace(environmentValue))
{
    switch (environmentValue.ToLower())
    {
        case "p":
            _connectionSettings.Production();
            break;
        case "t":
            _connectionSettings.Test();
            break;
        case "d":
            _connectionSettings.Development();
            break;
        case "l":
            _connectionSettings.Local();
            break;
    }
}
然而,当打开“优化”时,即使environmentValue的值为空,它也始终会命中最后一个case语句,即首先不应进入开关

我不得不更改代码,使其与此类似,现在它使用默认值:case

var environmentValue = settingsProvider.ApplicationEnvironment;
if (!string.IsNullOrWhiteSpace(environmentValue))
{
    switch (environmentValue.ToLower())
    {
        case "p":
            _connectionSettings.Production();
            break;
        case "t":
            _connectionSettings.Test();
            break;
        case "d":
            _connectionSettings.Development();
            break;
        case "l":
            _connectionSettings.Local();
            break;
        default:
            Console.WriteLine(environmentValue);
            break;
    }
}
我正在通过Visual Studio 2015、框架版本4.5.1、发布模式、任何CPU(首选32位)运行此功能,并仅启用关闭的代码

当我第一次开始写这篇文章的时候,我没有意识到这只是在逐步阅读代码的时候。不过,它似乎有一些奇怪的行为,因为我没有单步执行代码,仍然在执行最后一个case语句

我还创建了一个gist项目来说明这个问题

对于我编写的测试应用程序,它只需要在之后进行另一次调用,这将强制它正确运行,但是在实际应用程序中,它已经有了使用相同对象的其他调用,但是它的工作方式并不完全相同


除了像我这样添加一个伪默认情况外,有人知道如何在逐步优化代码时避免这个问题吗?

这通常是发布构建代码的问题,重新排序代码,使可执行机器代码到程序中源代码行的映射变得模糊。这是调试配置首先存在的基本原因。单步和断点并不是唯一的行为不正常的调试功能,检查局部变量也会停止工作

有一个调试器选项,可以在使用调试器时强制禁用优化器,即使对于版本生成代码也是如此。使用工具>选项>调试>常规>勾选“抑制JIT优化”复选框。默认情况下已启用。启用该选项后,示例程序的行为正常。所以你可能把它关掉了


当您将调试器附加到正在运行的程序或使用debugger.break()中断时,该选项不可能始终有效,也不起作用。请记住,修改代码是完全没有必要的。从repro代码段可以看出,它实际上并没有调用Local()方法。它只是突出显示了错误的源代码行,仅此而已。模糊映射。请记住,当您调试代码的发布版本时,调试将是不可靠的,您将处于领先地位。然后重新打开该选项。

这很奇怪,因为它实际上正在调用该方法,因为它正在连接到本地服务,而不是它应该连接的服务。但是我现在还没能让它重现。启用该选项后,也可以正确显示。非常感谢。