我認爲我的觀點很清楚,在任何情況下,這可以拋出空引用異常嗎?即試圖訪問它的Count
屬性時反對e.Result爲空。這個`if`語句是否會生成一個空引用異常呢?
if (e.Result == null || e.Result.Count == 0)
return;
編輯:爲了獲得最這個問題的(供以後嶄露頭角的提問者),我們將如何防止異常情況的發生,我們可以使用lock
聲明?怎麼樣?
我認爲我的觀點很清楚,在任何情況下,這可以拋出空引用異常嗎?即試圖訪問它的Count
屬性時反對e.Result爲空。這個`if`語句是否會生成一個空引用異常呢?
if (e.Result == null || e.Result.Count == 0)
return;
編輯:爲了獲得最這個問題的(供以後嶄露頭角的提問者),我們將如何防止異常情況的發生,我們可以使用lock
聲明?怎麼樣?
只有當e爲null時纔會這樣做。
e == null
OR
多線程&競爭條件?
'e'不能爲'null',因爲它是一個事件處理程序,不能手動調用。 –
@LordCover只是因爲變量名爲'e'並不意味着它是一個事件處理程序:) – marcind
@marcind,我知道:),但我是這裏的開發人員,我告訴你,它來自一個事件處理程序。 –
編號 - e.Result == null將被首先評估,如果它是true,那麼將立即調用返回值,並且不會評估第二種情況。它可能會有不同的線程
不考慮多線程,我認爲是這樣。 –
如果Result
有它自己的代碼,並且該代碼因該錯誤失敗,它可能會拋出「空引用異常」。
EventArgs args = e;
if (args.Result == null || args.Result.Count == 0)
{
return;
}
這個想法是,你首先將事件args(e)複製到你自己的本地元素中,並將其用於if條件檢查。請注意確保副本足夠深以複製結果(否則,如果另一個線程在if檢查的中途結束時,您仍然會遇到多線程情況)。本地副本始終是線程安全的。
但是本地副本是對原始副本的引用,對吧?它會受到原始對象所應用內容的影響。 –
它不會受一些改變引用'e'的代碼的影響(例如,一些外部代碼'e = null'不會將本地副本的參數設置爲空),但它肯定會受到操縱'結果「在'e'中(例如,如果外部代碼運行'e.Result = null',那麼肯定會將本地副本的Result也設置爲null)。這就是爲什麼我添加了備註:確保做一個深層複製(我上面的代碼可能不會反映深層複製,但多數民衆贊成在這個想法) – Bhaskar
爲什麼不復制e.Result呢? –
除了其他人已經指出的多線程/競態條件問題,您可能正在尋找的主題是short-circuit evaluation。在C#中,||
運營商使用短路(而不是|
,這是急切的),所以如果e.Result == null
評估爲真,e.Result.Count == 0
將不會被評估。
其他人已經回答了,但我想給你這種類型的行爲和一些進一步閱讀的名稱。
對後兩個問題的回答是(1)是的,(2)是否依賴。假設你構建了正確的鎖,並設法在沒有崩潰的情況下「計數」。然後你解鎖結果,它變異爲有*不同*數。 **你將如何處理你剛剛成功捕獲的現在不準確的計數?**對於不正確的計數做任何事情似乎是危險的。爲多線程場景提供* general *建議沒有意義;給我們一個*逼真的場景,我們可以提供建議。 –