簡體   English   中英

ReSharper是否正確處理Debug.Assert(..)?

[英]Does ReSharper handle Debug.Assert(..) correctly?

我的代碼我正在使用System.Function方法Debug.Assert(..)來驗證方法開頭的輸入參數(請參閱下面的示例代碼剪切):

public class TestClass : IInterface
{
}

public class Verifier
  {
     public static void Verify(IInterface objectToVerify)
     {
        Debug.Assert((objectToVerify is TestClass), "Passed object must be type of TestClass");

        // ReSharper (Version 7.1.1) marks here "Expression is always false
        if (!(objectToVerify is TestClass))
        {
           return;
        }

        // do something ...
     }
  }

如果我注釋掉Debug.Assert語句,ReSharper警告就會消失。 在我看來,ReSharper必須忽略這個Debug.Assert語句,因為如果Debug.Assert語句,則執行下面的代碼(例如,在Release模式下)

你有什么意見? 或者是否有其他實施方案?

不,我認為resharper是錯誤的,原因很簡單: Resharper說,當我們知道事實並非如此時,代碼是無法訪問的。

如果在對話框中單擊“忽略”,則發布版本將始終執行該代碼,調試版本將觸發它。

在斷言是否是錯誤之后繼續並不重要,它仍然是無法訪問的代碼。

ReSharper的是足夠聰明,知道Debug.Assert()如果將停止執行objectToVerify不是TestClass 因此, if語句中的表達式確實總是為false (否則首先不會達到if語句)。

您可以通過寫下以下內容來解決警告:

public static void Verify(IInterface objectToVerify)
{
    if (!(objectToVerify is TestClass))
    {
        Debug.Assert(false, "Passed object must be type of TestClass");
        return;
    }

    // do something ...
}

老問題,但我剛剛遇到這個問題並通過切換HeuristicUnreachableCode來解決它(美化):

Debug.Assert(false, "type/fieldNum not processed");
// ReSharper disable HeuristicUnreachableCode
return null;
// ReSharper restore HeuristicUnreachableCode

我讀了一個Debug.Assert為“這個表達式是false永遠不會發生”。 Resharper警告與該用途一致。 它只是相信你的斷言。 當你的語句的then部分執行時,你的程序有一個bug。

但是,您可以在公共API上的調試時使用它進行參數驗證。 我不會為此使用斷言。 在這種情況下你應該拋出異常,並消除你的if(...)return

您可以使用代碼合同

代碼看起來像這樣 -

  public class Verifier
  {
     public static void Verify(IInterface objectToVerify)
     {
        Contract.Requires<ArgumentException>((objectToVerify is TestClass), "Passed object must be type of TestClass");

        // do something ...
     }
  }

在調試和發布模式下工作。 在這里閱讀更多

暫無
暫無

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

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