簡體   English   中英

條件為假,但執行了 if 語句中的代碼

[英]Condition false, but code inside the if statement executed

我有以下方法:

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 為假,為什么執行 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");
}

但為什么?

這可能是調試器和多個線程的問題,嘗試將鎖定放在if語句的外部而不是屬性內部。

調試器中的Expression窗口是觸發異常的窗口,而不是代碼。 刪除表達式(或觀察),它應該按預期工作。

這個答案解釋了我遇到的問題: https//stackoverflow.com/a/27552124/1830461

將此格式的某些內容編譯為64位可能會導致調試器進入if語句:

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

這是Visual Studio中的一個錯誤。 代碼實際上沒有執行。 解決方案是忽略它並繼續單步執行代碼。 在其上放置一個鎖定語句會修復它,因為它不再是那種格式。

我在調試代碼時遇到過這種情況,而配置模式是Release

只需將配置模式設置為Debug即可解決問題。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM