我有一个实现IDisposable的类,因为它有一个私有成员字段“foo”,它是IDisposable(在构造函数中初始化)。我出乎意料地得到了CA2000代码分析错误,这要求我确保丢弃foo。但是,我在我的类的Dispose()代码中有foo.Dispose(),它应该处理这个问题。
我做了一些搜索,但令人惊讶的是找不到答案。我究竟做错了什么?显然我遗漏了一些基本的东西。如何编写代码来克服这个问题?
我的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
答案 0 :(得分:7)
CA2000错误不是指实现IDisposable
的容器,而是指使用未正确处理的本地容器。原因是您在一次性对象上使用对象初始值设定项。将生成的实际代码基本上是以下
Dim temp = New SomethingDisposable()
temp.Name = "hello"
Foo = temp
此代码被FxCop正确标记为未在所有实例中正确处理IDisposable
(在temp.Name = "hello"
行上可能发生异常,在这种情况下不会被处置) 。
修复方法是不在此处使用对象初始值设定项并直接初始化Foo
Foo = New SomethingDisposable()
Foo.Name = "hello"