条件为false,但if语句中的代码已执行
我有以下方法:
public bool ConnectAsync() { if (IsConnected) throw new InvalidOperationException("Socket is already connected"); if (IsConnecting) { throw new InvalidOperationException("Attempt to connect in progress"); } . . . }
哪里:
private readonly object padLock = new object(); private bool isConnecting = false; public bool IsConnected { get { lock (padLock) { return socket.Connected; } } } public bool IsConnecting { get { lock (padLock) { return isConnecting; } } private set { lock (padLock) { isConnecting = value; } } }
如果我的变量isConnecting为false,为什么执行if语句中的代码?
编辑 :
如果我使用提交的isConnecting
而不是属性IsConnecting
我有相同的行为。 代码在任何地方都在同一个线程中运行。
编辑2 :
最后这个工作:
lock (padLock) { if (IsConnecting) throw new InvalidOperationException("Attempt to connect in progress"); }
这有效:
{ if (IsConnecting) throw new InvalidOperationException("Attempt to connect in progress"); }
但为什么?
调试器中的Expression窗口是触发exception的窗口,而不是代码。 删除表达式(或观察),它应该按预期工作。
这可能是调试器和多个线程的问题,尝试将锁定放在if语句的外部而不是属性内部。
这个答案解释了我遇到的问题: https : //stackoverflow.com/a/27552124/1830461
将此格式的某些内容编译为64位可能会导致调试器进入if语句:
if (falseCondition) throw new Exception(); try { } catch { }
这是Visual Studio中的一个错误。 代码实际上没有执行。 解决方案是忽略它并继续单步执行代码。 在其上放置一个锁定语句会修复它,因为它不再是那种格式。