【发布时间】:2020-05-01 01:00:28
【问题描述】:
某位同事遇到了一个非常奇怪的调试问题,他通过一个开关单步执行某些情况,但之后它也遇到了默认情况。我不知道这怎么可能发生!
它很容易重现,我终于将代码提取到一个小测试中。
如果我只在默认情况下设置断点,那么调试器将永远不会停在那里。但是如果我在 case 42 处添加断点,然后使用 step over,之后会遇到默认情况!! 请注意,尽管从未达到目标。所以似乎调试器正在显示一些实际上没有发生的事情? 另外,如果我删除异步任务并等待,那么它就不会发生.. 我们还需要另一个声明变量的案例(一些花哨的东西,而不是简单的整数等)
public class Foo
{
public readonly string Bar = nameof(Bar);
}
public async Task DoSomething(int x)
{
try
{
switch (x)
{
case 43:
var foo = new Foo();
break;
case 42:
Console.WriteLine(x);
break;
default:
throw new NotImplementedException("aaarghh..");
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private async void btnSomethingTo_Click(object sender, EventArgs e)
{
await DoSomething(42);
}
由 Sinatr 创建的 GIF 来说明手头的主题,谢谢!
【问题讨论】:
-
您编译为 Debug 还是 Release?
NotImplementedException真的会被抛出吗? -
似乎调试器无法正确显示当前语句。
-
您确定您的代码构建正确吗?也就是说,您可能正在调试一个旧的 exe,并且代码在构建后发生了变化?
-
我相信这与调试模式下 switch 语句被编译为 if-else 语句(而不是发布模式下的跳转表)这一事实有某种关系。因此,不要在休息后击中最后一个花括号;声明它命中默认的最后一行。
-
啊,不,我已经复制了这个。只有当
DoSomething方法是async时才会发生这种情况。我认为调试器只是糊涂了。
标签: c# debugging switch-statement