gpt4 book ai didi

.net - 为什么我在 IDisposable 类中获得带有私有(private)成员 IDisposable 的 CA2000?

转载 作者:行者123 更新时间:2023-12-04 12:00:18 26 4
gpt4 key购买 nike

我有一个实现 IDisposable 的类,因为它有一个 IDisposable 的私有(private)成员字段“foo”(在构造函数中初始化)。我意外地收到了 CA2000 代码分析错误,它希望我一定要处理掉 foo。但是,我在类(class)的 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"

关于.net - 为什么我在 IDisposable 类中获得带有私有(private)成员 IDisposable 的 CA2000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4663693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com