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