2011-01-11 67 views
7

我有一個實現IDisposable的類,因爲它有一個IDisposable(在構造函數中初始化)的私有成員字段「foo」。我意外地得到了一個CA2000代碼分析錯誤,該錯誤要求我確定要處置foo。但是,我在我的類的Dispose()代碼中有foo.Dispose(),應該處理這個問題。爲什麼我在IDisposable類中使用私有成員IDisposable獲取CA2000?

我做了一些搜索,驚奇地找不到答案。我究竟做錯了什麼?顯然我缺少一些基本的東西。我如何編寫我的代碼來克服這個問題?

我的VB代碼:

Public Class Bar 
    Implements IDisposable 

    Private Foo As SomeDisposableThing 

    Public Sub New() 
     Foo = New SomeDisposableThing() With {.name = "hello"} 
    End Sub 

    '''' snip '''' 

    Private disposedValue As Boolean = False  ' To detect redundant calls ' 

    Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
       If Foo IsNot Nothing Then Foo.Dispose() 
      End If 
     End If 
     Me.disposedValue = True 
    End Sub 

    Public Sub Dispose() Implements IDisposable.Dispose 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 

End Class 

回答

7

的CA2000錯誤不是指執行IDisposable容器,而是使用未妥善處理本地的。原因是您在一次性對象上使用對象初始值設定項。 ,將獲得實際產生的代碼基本上如下

Dim temp = New SomethingDisposable() 
temp.Name = "hello" 
Foo = temp 

此代碼是正確的的FxCop標記爲不恰當地處置在所有情況下的IDisposable的有關temp.Name = "hello"線發生異常(有可能在這種情況下,它不會被丟棄)。

解決方法是不是在這裏使用一個對象初始化和初始化Foo直接

Foo = New SomethingDisposable() 
Foo.Name = "hello" 
+0

呸。消息:不要使用屬性:( – 2011-01-12 00:28:20

相關問題