2

我認爲我的觀點很清楚,在任何情況下,這可以拋出空引用異常嗎?即試圖訪問它的Count屬性時反對e.Result爲空。這個`if`語句是否會生成一個空引用異常呢?

if (e.Result == null || e.Result.Count == 0) 
    return; 

編輯:爲了獲得最這個問題的(供以後嶄露頭角的提問者),我們將如何防止異常情況的發生,我們可以使用lock聲明?怎麼樣?

+4

對後兩個問題的回答是(1)是的,(2)是否依賴。假設你構建了正確的鎖,並設法在沒有崩潰的情況下「計數」。然後你解鎖結果,它變異爲有*不同*數。 **你將如何處理你剛剛成功捕獲的現在不準確的計數?**對於不正確的計數做任何事情似乎是危險的。爲多線程場景提供* general *建議沒有意義;給我們一個*逼真的場景,我們可以提供建議。 –

回答

8

只有當方法不是線程安全時,該代碼纔會拋出NullReferenceException。意思是說,如果另一個線程決定在您的e.Result == null檢查之後恰好在您的e.Result.Count == 0檢查之前確定將null設置爲e.Result

+1

'e'也可以爲空...... – marcind

+2

@marcind是的,但問題是關於'e.Result'而不是'e'本身。 – Marlon

3

只有當e爲null時纔會這樣做。

1
e == null 

OR

多線程&競爭條件?

+0

'e'不能爲'null',因爲它是一個事件處理程序,不能手動調用。 –

+1

@LordCover只是因爲變量名爲'e'並不意味着它是一個事件處理程序:) – marcind

+1

@marcind,我知道:),但我是這裏的開發人員,我告訴你,它來自一個事件處理程序。 –

1

編號 - e.Result == null將被首先評估,如果它是true,那麼將立即調用返回值,並且不會評估第二種情況。它可能會有不同的線程

+0

不考慮多線程,我認爲是這樣。 –

1

如果Result有它自己的代碼,並且該代碼因該錯誤失敗,它可能會拋出「空引用異常」。

0
  EventArgs args = e; 
      if (args.Result == null || args.Result.Count == 0) 
      { 
       return; 
      } 

這個想法是,你首先將事件args(e)複製到你自己的本地元素中,並將其用於if條件檢查。請注意確保副本足夠深以複製結果(否則,如果另一個線程在if檢查的中途結束時,您仍然會遇到多線程情況)。本地副本始終是線程安全的。

+1

但是本地副本是對原始副本的引用,對吧?它會受到原始對象所應用內容的影響。 –

+1

它不會受一些改變引用'e'的代碼的影響(例如,一些外部代碼'e = null'不會將本地副本的參數設置爲空),但它肯定會受到操縱'結果「在'e'中(例如,如果外部代碼運行'e.Result = null',那麼肯定會將本地副本的Result也設置爲null)。這就是爲什麼我添加了備註:確保做一個深層複製(我上面的代碼可能不會反映深層複製,但多數民衆贊成在這個想法) – Bhaskar

+0

爲什麼不復制e.Result呢? –

0

除了其他人已經指出的多線程/競態條件問題,您可能正在尋找的主題是short-circuit evaluation在C#中,||運營商使用短路(而不是|,這是急切的),所以如果e.Result == null評估爲真,e.Result.Count == 0將不會被評估。

其他人已經回答了,但我想給你這種類型的行爲和一些進一步閱讀的名稱。