C# 为什么调试器会遇到默认情况?
某位同事遇到了一个非常奇怪的调试问题,在这个问题中,他单步执行一个开关,单步执行某些情况,但之后它也会执行默认情况。我不知道这怎么会发生 它很容易复制,我最终将代码提取到一个小测试中 如果我只在默认情况下设置断点,那么调试器将永远不会停止。但是,如果我在案例42中添加一个断点,然后使用step over,它将在之后命中默认案例!! 不过,请注意,渔获量永远达不到。那么,调试器似乎显示了一些实际上没有发生的事情? 另外,如果我删除异步任务并等待,那么它就不会发生。。 我们还需要另一个声明变量的案例(一些花哨的东西,而不是简单的整数等等) 由Sinatr创建的GIF,用于说明手头的主题,谢谢!C# 为什么调试器会遇到默认情况?,c#,debugging,switch-statement,C#,Debugging,Switch Statement,某位同事遇到了一个非常奇怪的调试问题,在这个问题中,他单步执行一个开关,单步执行某些情况,但之后它也会执行默认情况。我不知道这怎么会发生 它很容易复制,我最终将代码提取到一个小测试中 如果我只在默认情况下设置断点,那么调试器将永远不会停止。但是,如果我在案例42中添加一个断点,然后使用step over,它将在之后命中默认案例!! 不过,请注意,渔获量永远达不到。那么,调试器似乎显示了一些实际上没有发生的事情? 另外,如果我删除异步任务并等待,那么它就不会发生。。 我们还需要另一个声明变量的案例
您使用的剂量测定法不正确。 ASYNC关键字意味着您在方法中的某个地方有一些wait调用(以便在任务结束后获取返回点),但您没有。 您奇怪的调试器行为与实现有关。您的异常不是由事实引发的。我已经复制了您的案例,MyException构造函数被调试器忽略/跳过,并且catch(Exception exc)部分中的代码也从未调用过。或者,如果我在案例42:中被打断,我只需按F5,那么默认部分中的断点将被跳过
public async Task DoSomething(int x)
{
try
{
switch (x)
{
case 43:
var foo = new Foo();
break;
case 42:
Debug.WriteLine(x);
break;
case 44:
break;
default:
throw new MyException("aaarghh..");
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private async void button1_Click(object sender, EventArgs e)
{
await DoSomething(42);
}
public class MyException : Exception
{
public MyException(string message): base(message)
{
if (message != null)
Debug.WriteLine(message);
}
public MyException() : base()
{
}
public MyException(string message, Exception innerException) : base(message, innerException)
{
}
}
您是作为调试版还是发布版编译的?
NotImplementedException
是否真的被抛出?看起来更像是调试器无法正确显示当前语句。您确定您的代码构建正确吗?也就是说,您可能正在调试一个旧的exe,并且代码自构建以来发生了更改?我相信这与以下事实有关:在调试模式下,switch语句被编译为if-else语句(而不是在发布模式下的跳转表)。因此,不要在休息后打最后一个卷发支撑;语句,它命中最后一行,这是默认的。啊,不,我复制了这个。只有当DoSomething
方法是async
时才会发生这种情况。我觉得调试器有点混乱。好吧,我可以在DoSomething中添加一个异步方法,但这与问题无关,不管你有没有行为正常的代码。在调试窗口中,您将只有“42”,但没有“aaarghh..”即使我等待内部DoSomething
,我仍会复制此信息。是的,我认为这与调试器被为async
方法生成的代码弄糊涂有关,但这与wait
内部是否有DoSomething
无关。你说“你使用的DoSomething方法不正确”——我认为“不正确”与此无关,我的观点是,我可以更新问题,并在其中添加一个等待的方法。那么,行为还是一样的,你的回答没有添加任何新的见解。我已经发现代码并没有实际执行。(请参见OP“看来调试器正在显示实际未发生的事情?”)
public async Task DoSomething(int x)
{
try
{
switch (x)
{
case 43:
var foo = new Foo();
break;
case 42:
Debug.WriteLine(x);
break;
case 44:
break;
default:
throw new MyException("aaarghh..");
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
private async void button1_Click(object sender, EventArgs e)
{
await DoSomething(42);
}
public class MyException : Exception
{
public MyException(string message): base(message)
{
if (message != null)
Debug.WriteLine(message);
}
public MyException() : base()
{
}
public MyException(string message, Exception innerException) : base(message, innerException)
{
}
}