我有一个实现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
CA2000错误不是指实现Idisposable的容器,而是使用未正确处理的本地容器.原因是您在一次性对象上使用对象初始值设定项.将生成的实际代码基本上如下
Dim temp = New Somethingdisposable() temp.Name = "hello" Foo = temp
此代码被Fxcop正确标记为未在所有实例中正确处理Idisposable(可能在temp.Name =“hello”行上发生异常,在这种情况下它不会被处置).
解决方法是不在此处使用对象初始值设定项并直接初始化Foo
Foo = New Somethingdisposable() Foo.Name = "hello"