条件为false,但if语句中的代码已执行

时间:2012-11-02 20:49:25

标签: c# if-statement

我有以下方法:

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; }
        }
    }

enter image description here

如果我的变量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");
}

但为什么?

3 个答案:

答案 0 :(得分:4)

这可能是调试器和多个线程的问题,尝试将锁定放在if语句的外部而不是属性内。

答案 1 :(得分:3)

调试器中的Expression窗口是触发异常的窗口,而不是代码。删除表达式(或观察),它应该按预期工作。

答案 2 :(得分:0)

这个答案解释了我遇到的问题: https://stackoverflow.com/a/27552124/1830461

将此格式的某些内容编译为64位可能导致调试器进入if语句:

        if (falseCondition) 
            throw new Exception(); 
        try { }  catch { }

这是Visual Studio中的一个错误。代码实际上没有执行。解决方案是忽略它并继续单步执行代码。在其上放置一个锁定语句会修复它,因为它不再是那种格式。