.net 我能期望垃圾收集器关闭流吗?

.net 我能期望垃圾收集器关闭流吗?,.net,vb.net,stream,.net,Vb.net,Stream,我有一个类似流的类,带有“Close”函数。此类的实例存储在字段/属性中。有时我不得不用一个新的实例来替换这个实例。不幸的是,我无法确定是否有人仍在使用该对象的旧实例(许多函数将此字段与多线程一起使用)。所以我可以在不关闭类的情况下覆盖字段。我可以期望GC删除未关闭的对象吗?或者我可以在dispose函数中关闭它吗 谢谢。您的类应该是,它的任何用户都应该在 这将确保正确关闭/处置 GC不会关闭/处置仍然被引用的类,因此它实际上取决于您编写的代码以及类的使用方式。您的类应该是,并且它的任何用户都应

我有一个类似流的类,带有“Close”函数。此类的实例存储在字段/属性中。有时我不得不用一个新的实例来替换这个实例。不幸的是,我无法确定是否有人仍在使用该对象的旧实例(许多函数将此字段与多线程一起使用)。所以我可以在不关闭类的情况下覆盖字段。我可以期望GC删除未关闭的对象吗?或者我可以在dispose函数中关闭它吗

谢谢。

您的类应该是,它的任何用户都应该在

这将确保正确关闭/处置

GC不会关闭/处置仍然被引用的类,因此它实际上取决于您编写的代码以及类的使用方式。

您的类应该是,并且它的任何用户都应该在一个特定的环境中实例化它

这将确保正确关闭/处置

GC不会关闭/处置仍被引用的类,因此这实际上取决于您编写的代码以及类的使用方式。

您不仅可以使用dispose方法关闭它,而且还可以使用关闭它,因为最类似的流包含非托管资源,这是垃圾收集器无法处理的。如果您已经使用了
IDisposable
类,请始终
Dispose

如果在类中使用实现
IDisposable
的类,那么类也应该实现接口。

您不仅可以使用dispose方法关闭它,而且可以关闭它,因为流最像包含非托管资源,垃圾回收器无法处理这些资源。如果您已经使用了
IDisposable
类,请始终
Dispose


如果在类中使用实现IDisposable的类,那么类也应该实现接口。

FileStream
等。确实有一个Finalize()方法,它只调用
Dispose()
。虽然这将保证句柄最终关闭是真的,但它不是确定性的。如果您可以自己手动关闭流,那么这是非常首选的方法。
Finalize()
方法只有在流没有手动关闭的情况下才会出现(通常是由于逻辑中的错误)


事实上,即使是
Finalize()
方法也不能100%保证被调用。但是,一旦程序退出,操作系统将关闭所有句柄。

FileStream
等。确实有一个Finalize()方法,它只调用
Dispose()
。虽然这将保证句柄最终关闭是真的,但它不是确定性的。如果您可以自己手动关闭流,那么这是非常首选的方法。
Finalize()
方法只有在流没有手动关闭的情况下才会出现(通常是由于逻辑中的错误)


事实上,即使是
Finalize()
方法也不能100%保证被调用。但是,一旦程序退出,操作系统将关闭所有句柄。

如果类有终结器,则选择“是”。但是,根据你的描述,这不是重点

最有可能的情况是,您希望类实现
IDisposable
,这样您就可以尽早释放非托管资源(或拥有的一次性实例)


但似乎还有更大的设计问题。鉴于您可以控制该字段,您应该知道何时可以安全地创建新实例和/或何时处置它。显然,您有一些跨线程的共享实例,而没有对该实例拥有明确所有权的东西。如果没有代码和更详细的描述,我可能是错的,但这听起来像是一场等待发生的事故。

如果您的类有终结器,那么是的。但是,根据你的描述,这不是重点

最有可能的情况是,您希望类实现
IDisposable
,这样您就可以尽早释放非托管资源(或拥有的一次性实例)


但似乎还有更大的设计问题。鉴于您可以控制该字段,您应该知道何时可以安全地创建新实例和/或何时处置它。显然,您有一些跨线程的共享实例,而没有对该实例拥有明确所有权的东西。如果没有代码和更详细的描述,我可能是错的,但这听起来像是一个即将发生的事故。

OP的类没有理由不能像Stream类那样公开Close(),Stream类最终会在所需的基础上调用Disposeobjects@Aaron-我同意它可以而且可能应该这样做,
dispose
实现应确保关闭。但是依赖代码的用户来做正确的事情会导致有趣的bug。不幸的是,这正是dispose模式所需要的。除了让GC跟踪内存以外的非托管资源外,没有办法保证非托管资源得到清理,除非让代码用户采取特殊步骤(例如
使用
语句)来保证清理。OP的类没有理由不能同时公开Close()正如Stream类所做的那样,它最终将在所需的基础上调用Disposeobjects@Aaron-我同意它可以而且可能应该这样做,
dispose
实现应该确保关闭。但是依赖代码的用户来做正确的事情会导致有趣的bug。不幸的是,这正是dispose模式所需要的。除了让GC跟踪内存以外的非托管资源外,除了让代码用户采取特殊步骤(例如
using
语句)来保证清理之外,没有办法保证非托管资源得到清理。