2014-11-21 80 views
1

有沒有什麼辦法標記一個方法,以便代碼分析或建立與提供錯誤消息來處置方法返回的對象。例如,在下面的方法。任何方式來知道如果調用方法應該處置被調用的方法返回的對象

private void chart1_Click(object sender, EventArgs e) 
    { 
     Brush sb = GetBlackBrush(); 
    } 

    Brush GetBlackBrush() 
    { 
     SolidBrush sb = new SolidBrush(Color.Black); 
     return sb; 
    } 

,只要任何所謂GetBlackBrush方法,同時建立在VS2010的解決方案,我應該得到一個代碼分析警告或建立自己的錯誤或建立警告,以表明我需要處理Brush對象。我想我應該在chart1_Click()方法中處理刷子對象。

這只是一個示例代碼,我知道我們應該使用「使用」但這裏有什麼解決方案。

有一個CA2213代碼分析警告,但沒有被調用這個特定的例子。

+1

你真的不想立刻處置它,是嗎? – leppie 2014-11-21 07:20:50

+1

在這種情況下,代碼分析無法判斷是否需要處理該對象。該方法返回該對象,這通常意味着它不應該被丟棄,因爲您將它交給其他代碼。所以在你的例子中,你不應該使用'using'。一般來說,代碼分析在識別未處理的對象以及不離開該方法方面做得很好。 你有一個更合理的例子,代碼分析沒有發現真正的錯誤嗎? – 2014-11-21 07:22:18

+0

這是一個真正的例子,如果您在其他方法中使用此方法GetBlackBrush(),代碼分析不會給出任何錯誤。代碼分析不會給出錯誤。 – 2014-11-21 07:29:41

回答

0

CA2000警告是你可能會後,看到documentation

如果一次性對象未明確設置所有 引用之前,它是超出範圍,對象將在一些 不確定的配置垃圾收集器運行終結器的時間爲 的對象。由於可能發生的異常事件會阻止對象運行的終結器 ,因此該對象應該是 而不是。

不確定您是否可以將其標記爲錯誤,但應該將其標記出來。 您可能也想啓用CA2213

+0

你對CA2213正確,但只是嘗試這個例子,我沒有得到運行代碼分析後的CA2213。 – 2014-11-21 07:56:31

+0

我剛剛檢查過它,並在一個案例中(在同一班)它顯示警告,並在其他(IDisposable創建外部類)它不是。我正在使用VS2013 – b2zw2a 2014-11-21 08:00:37

0

沒有特定的約定用於指示哪些方法轉移對象的所有權,並且框架本身在這方面相當不一致。如果方法創建並返回對新的參考文件而不保留該參考的副本,則該畫筆的收件人應該處理該參考。相反,如果該方法做了一些這樣的:

WeakReference<Brush> myBrush = new WeakReference<Brush>(); // Field of class hosting method 

Brush GetBlackBrush() 
{ 
    Brush ret = myBrush.Target; 
    if (ret == null) 
    { 
    ret = new SolidBrush(Color.Black); 
    myBrush.Target = ret; 
    } 
} 

然後正確性將決定它收到[使用弱引用的對象上的收件人呼叫Dispose將確保不會在任何時刻上面的代碼只會泄露一個額外的SolidBrush對象;如果調用者放棄實例而不放棄它,那麼一般情況下,GC不會注意到實例已被放棄(在這種情況下,下一個調用者將收到同一個實例),或者它已經清理了它。無論哪種情況,每次只能放棄一個筆刷實例。另外,在刷子實例上調用Dispose,而myBrush持有對它的引用會破壞下一個調用者GetBlackBrush()