.net – 为什么我在IDisposable类中使用私有成员IDispos获取CA2000?

我有一个实现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"

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...