- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,我需要将 IDisposable 和对象终结的建议模式与 VS2005/VB.NET 提供的自动生成模式进行比较。我们已经使用了自动生成的一个,但是在并排查看它之后,我对 VB.NET 实现有很多疑问......
作为引用,这里是 IDE 的实现:
Public Class Class1
Implements IDisposable
Private disposedValue As Boolean = False ''// To detect redundant calls
''// IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
''// TODO: free managed resources when explicitly called
End If
''// TODO: free shared unmanaged resources
End If
Me.disposedValue = True
End Sub
#Region " IDisposable Support "
''// This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
''// Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
Dispose()
的情况下和 Dispose(disposing as boolean)
为什么 GC 会选择调用重载的非接口(interface)成员? Dispose()
时执行的扩展代码路径的假定附加值感到困惑。被显式调用(与不管
Dispose()
是否被显式调用都执行的公共(public)路径相反)。虽然我可以理解它是出于善意提供的,但如果
Dispose()
会延迟托管资源的实际释放,我看不出它有什么作用。不直接调用。从本质上讲,它似乎只能使对象图中的托管资源无法访问,将它们孤立起来直到第二次 GC 运行,而不是在已知不再需要它们的时候释放它们。
最佳答案
您的问题存在逻辑错误...如果 Dispose()
在终结器中调用,那么是的,disposedValue
将为假,这意味着 If Not Me.disposedValue Then...
将执行。为 disposing
传递的参数是 true
,所以那里的所有代码都应该执行得很好。
编辑
(结果是终结器调用 Dispose(false))
表单上的终结器(仅在表单上从未调用 Dispose()
时运行)调用 Dispose(false)
.原因是 Form
目前正在GC'ed。结果,MANAGED 资源(即 Form
上的组件)将被收集,它们自己的终结器应调用 Dispose()
如果需要。 Dispose(false)
中只应释放非托管资源.
关于vb.net - 为什么 VS2005/VB.NET 使用 Dispose(disposing as boolean) 重载实现 IDisposable 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773165/
据我所知,这是一个公认的规则,如果你有一个具有 IDisposable 成员 m 的类 A,A 应该实现 IDisposable 并且它应该在其中调用 m.Dispose()。 我找不到令人满意的理由
我有一个父类和子类都需要实现IDisposable。 virtual(和 base.Dispose()?)调用应该在哪里发挥作用?当我只是重写 Dispose(bool disposing) 调用时,
我意识到这个问题正在寻找的查询不足以找到 IDisposable 实现的每一个小问题,但每个早期警告都很重要,所以我会尽我所能。 我想知道是否有人提出了 NDepend 的 CQL 查询,该查询将列出
我对 C# 还是比较陌生,只是在过去几天才接触到“IDisposables”。我可以掌握 using block 的概念来处理必须处理的对象,而无需手动记住调用 .Dispose() 方法 - 方便!
在我的应用程序中,我有一个每隔几秒创建一次的大对象。我用它做了一些工作,然后就不再需要它了。 我在任务管理器中看到,即使我没有对该对象的任何引用并且需要收集它,ram 大小也会增加。 在实现 IDis
考虑一下: interface IFoo : IDisposable { } class Program { static void Main() { var foo = GetFoo
我是这么认为的。但是请看一下 ASP.NET 中的内置类: public sealed class HttpPostedFile { public Stream InputStream { g
昨天,在我们的代码库上运行 Visual Studio 代码分析后,以下代码被突出显示为一个问题: using (var stringReader = new StringReader(someStr
我认为这个问题说明了一切。 谢谢。 最佳答案 如果对象拥有该资源,他们应该实现IDisposable。通常不需要将事物设置为 null,尽管它没有坏处。 如果您不拥有该资源,那么显然您不应该处置它,并
MSDN 文档和 StackOverflow 上的许多答案竭尽全力讨论如何正确实现 IDisposable,例如MSDN IDisposable , MSDN Implementing IDispos
如果一个类继承自一个本身实现了 IDisposable 的接口(interface),该类是否也应该实现 IDisposable? 例如 internal IMyInterface : IDispos
当 出现时,正确处理接口(interface)的默认实现的最佳方法是什么?接口(interface)不继承自 IDisposable ?例如,假设我想做 public class FooGetter
我有一个实现 IDisposable 的类,因为它有一个 IDisposable 的私有(private)成员字段“foo”(在构造函数中初始化)。我意外地收到了 CA2000 代码分析错误,它希望我
如果我有一个相当标准的抽象类,它允许注入(inject)一个 IDisposable 实例。但是,一些继承自此类的类不应处置注入(inject)的存储库,而其他类则应处置。显而易见的解决方案是有一个构
这个问题在这里已经有了答案: Declare IDisposable for the class or interface? (7 个答案) 关闭 4 年前。 我想问的是,如果类 A 继承自 Int
我有一个“永远”存在于应用程序中的 IDiposable 对象。在我的例子中是 SemaphoreSlim,但这个问题实际上适用于任何可以处置的对象。 我确信只要应用程序运行,我就需要一个对象。所以问
我有一堆 IDisposable查找表中的对象(现在是普通的旧字典<>),但为了简化代码并避免错误,我正在寻找一个“拥有”它所拥有的项目的集合类,并避免重新发明轮子 - 这样做一个类已经存在? 规范应
很久以前来自 C/C++ 的我仍然有确保所有资源都被正确清理的习惯。我总是确保在 IDisposable 类上调用 Dispose 并在包含一次性对象的类中实现 Dispose 模式。 但是,在我的环
如果我有实现 IDisposable 的接口(interface)(来自 apress 书中的示例)像这样 public interface IArchitectRepository : IDispo
问题是如何测试调用 Finalize 时对象释放资源的事实。类的代码: public class TestClass : IDisposable { public bool HasBeenDi
我是一名优秀的程序员,十分优秀!