2011-11-18 99 views
3

我有幾個用戶控件,訂閱了另一個類中的事件處理程序。 我正在學習CodeContracts在C#中,我不知道,爲什麼靜態分析儀可以這樣寫代碼:爲什麼CodeContracts靜態分析器不會發出警告?

void MyUserControl_MouseEnter(object sender, MouseEventArgs e) 
{ 
    MyUserControl item = sender as MyUserControl;  
    item.DoSomething(); // I expect some warning here, because item can be null 

    sender.Equals(testObject); // This doesn't yield warning either 
} 

在這裏,我有一個潛在的不安全的代碼,這會導致空引用異常。 我明白了,那個靜態分析器可能無法檢查,sender的實際類型是什麼。但如果它不能證明它,我期望一些警告,如CodeContracts: Possibly calling a method on a null reference

或者我拿到合同錯誤的一些想法?我怎樣才能得到像這樣的錯誤的通知?

UPD:

是的,我也能Implicit Non-Null Obligation因爲它是在答案的建議,但我仍然沒有從靜態分析警告。此外,我試圖運行代碼分析與Microsoft All Rules規則設置,也沒有警告。 (但我寧願處理代碼契約和使用合同類執行一些額外的檢查,而不是用IF-THEN擲或別的東西)

+0

您是否啓用了「隱式空合約」? – CodesInChaos

回答

0

「我怎樣才能得到通知這樣的錯誤呢?」:ReSharper的意志在這種情況下警告你。

代碼合同會警告你,如果有一個「要求」,對象非空的對象可能爲空。你需要一個隱含的「需求」來解決對象的廢棄問題,這在表面上似乎是合理的,但是無論出於何種原因,哪個CC似乎都沒有提供。

文檔在http://msdn.microsoft.com/en-us/library/dd264808.aspx說,它並執行這樣的隱性契約。我正在進一步研究。

紅帽打我給它。更多詳細信息:您應該檢查項目屬性的代碼合同選項卡中的「靜態檢查」下的「隱式非空義務」框。

-1

性能代碼分析選項卡上的項目,你可以改變規則

+1

代碼分析!=代碼合同 – SLaks

3

你應該能夠在靜態分析選項「隱非空的義務」(工程選項|代碼分析)。

0

我有一個類似的問題。我必須在與「隱式非空義務」複選框相同的面板上打開警告級別滑塊。

相關問題