2012-01-05 40 views
0

下面的代碼生成一個CA2000警告:使用對象初始化生成CA 2000警告

Myclass myclass = null; 
try 
{ 
    myclass = new Myclass { Name = "a name" }; 
} 
finally 
{ 
    if (myclass != null) 
    { 
     myclass.Dispose(); 
    } 
} 

我發現了一些主題與同樣的問題,我的理解的問題是,編譯器生成構造一個臨時變量而對於這個變量,我並沒有調用Dispose()。

var tmp = new MyClass(); 
tmp.Name = "a name"; 
myclass = tmp: 

所以我的問題是,如果有使用它不產生CA2000警告對象初始化的解決方案。

感謝先進。

+0

我還想知道爲什麼要手動編寫'using'語句,但即使在那裏也會生成相同的警告。 – 2012-01-05 07:42:52

+0

參見[這個問題](http://stackoverflow.com/questions/6409918/object-initializer-and-dispose-when-property-can-throw-exception) – 2012-01-05 07:46:28

+0

我看到這個題目(和其他一些人有同樣的問題)。但是在所有這些話題中,我沒有找到使用對象初始值設定項的解決方案。 – rhe1980 2012-01-05 07:56:16

回答

0

如達明在評論中指出,FxCop的警告是有效的,因爲C#編譯器在一個隱藏的temp變量創建IDisposable實例,當異常的屬性之一的初始化過程中被拋出該實例不會得到處置。

有了一個良好的API設計,這不會是一個問題,因爲資源(實現IDisposable事情)應該包含一個Open(或BeginStart,等等)方法(根據框架設計指南),且不應泄漏在調用Open之前。創建此規則的原因與您所遇到的相同:在初始化過程中防止泄漏。 FDG是在C#3.0之前編寫的,但是當從該實例的構造函數中引發異常(由於異步異常(例如線程異常終止)而始終發生異常)時,存在同樣的問題。由於該實例的引用沒有在此時發佈,所以任何人都無法處置該實例。因此不建議在施工期間初始化底層資源。

因此,當Myclass包含某種Open方法,並且當您沒有使用自己實現IDisposable的值進行初始化時,您可以放心地丟棄該警告。在其他情況下,您應該還原到以下內容:

var myclass = new MyClass(); 

try 
{ 
    myclass.Name = "a name"; 
} 
finally 
{ 
    myclass.Dispose(); 
}