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