加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:23:13 所属栏目:大数据 来源:网络整理
导读:我有一个实现IDisposable的类,因为它有一个私有成员字段“foo”,它是IDisposable(在构造函数中初始化).我出乎意料地得到了CA2000代码分析错误,这要求我确保处理foo.但是,我在我的类的Dispose()代码中有foo.Dispose(),它应该处理这个问题. 我做了一些搜索,令
我有一个实现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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读