2013-01-24 48 views
12

我有一個條件我寫這是檢查三件事情。試圖理解爲什麼resharper告訴我表達式總是假的

if(LoggedInMembershipUser == null || obj == null || boolVal) 
在這種情況下,「LoggedInMembershipUser」

只是Membership.GetUser()「目標文件」是一些隨機的業務對象,而「boolVal」顯然是一個布爾值。當我按照上面的語句編寫語句時,resharper告訴我,語句的boolVal部分總是爲false。但是當我把boolVal作爲下面的beginnig時,我沒有得到這個通知。

if(boolVal|| LoggedInMembershipUser == null || obj == null) 

爲什麼第一個總是假而第二個不是?

編輯:這是在網格視圖的行數據綁定。網格顯示來自兩個具有相同基類的對象的結果,因此如果「obj」是對象類型之一而不是另一個,則「obj」將具有值。 boolVal是一個指示器,它是哪種類型的對象現在我想到了它我猜如果obj爲null,那麼boolVal將始終爲真。是resharper意識到一些如何?哦,我敢打賭,這是因爲看我的代碼我上面的線:

if (!uploaded){ 
    var obj = GetObjectLogic(); 
} 

好的感謝您的幫助意見。我想這可以被投票刪除或其他。

+2

「boolVal」是局部變量,字段還是屬性?對於'obj'和'LoggedInMembershipUser'也是同樣的問題。 –

+0

唯一想到的就是短路。嘗試使用'|'而不是'||'來查看resharper是否仍然抱怨。 – juharr

+0

你可以把(短)測試方法放在一起,以便我們可以在上下文中看到這一點。 – gh9

回答

15

沒有更多的是很難確切知道方法,但它看起來確實IKE如下:

ReSharper的已確定的唯一途徑是boolVal可以是真實的是如果LoggedInMembershipUserobj至少一個一片空白。那第一個if永遠不會到達boolval部分,除非兩者都不爲空。因此,在評估boolVal時它必須是假的。

如果您重新排列條件,則該邏輯不再成立。 ReSharper可能會分析這個表達式,確定所有部分都是快速和無副作用的,並且注意在第二種情況下也不是必需的,但是這種分析有點難度,而且顯然沒有被寫入。

+0

是的,這是怎麼回事。當我爲我的帖子創建編輯時,我意識到了這一點。 – William

+0

是的,我發佈我的答案後,我注意到你的編輯權。去搞清楚! :-) –

2

每當我用ReSharper調查一個意外的Expression is always true|false場景時,該工具已證明比我更聰明。例如,ReSharper知道繼承樹;在這個代碼塊:

void doSomething(Object obj) 
{ 
    if(obj is StreamReader || obj is TextReader) 
     foo(); 
} 

... ReSharper的將標誌着(obj is TextReader)作爲Expression is always false,因爲(obj is StreamReader)代碼分支將已經捕獲的任何TextReader對象,並躍升爲foo(),短路任何進一步的評估。

相關問題