手动销毁C#对象

41 浏览
0 Comments

手动销毁C#对象

我还是个学习C#的新手(有Java和C++背景),我有一个关于手动垃圾回收的问题:在C#中手动销毁对象是否可能?我知道有IDisposable接口,但是假设我正在处理一个由我没有编写,也不实现IDisposable接口的类呢?它不会有一个.Dispose()方法,因此,using {}也行不通,而.Finalize始终是protectedprivate,所以也不是一个选项。

(在这种情况下,我只是想了解在C#中有哪些可能性。我想,如果其他方法都失败了,我可以继承假设的ImNotDisposable类,以便它可以实现IDisposable。)

admin 更改状态以发布 2023年5月23日
0
0 Comments

如果该对象无法访问,则可以调用GC.Collect()并销毁该对象。 IDisposable的概念与CLR无关,主要用于用户代码实现额外的清除逻辑。在对象上调用Dispose()将不会从内存中释放对象本身,但它可能会处置此对象引用的任何资源。

我应该补充说,虽然我所说的是实现这一过程的一种方式,但在99.9999%的应用程序中,您永远不应该调用GC.Collect(),因为它通常会降低应用程序的性能,而不是提高性能。

0
0 Comments

你不需要手动销毁 .Net 对象。这就是所谓的受管理环境的含义。

实际上,如果对象是可到达的,这意味着你有一个引用,你可以用它来告诉 GC 你想要销毁哪个对象,那么收集该对象就是不可能的。GC 将永远不会收集任何仍然可到达的对象。

你可以调用 GC.Collect()来强制进行一般的垃圾回收。但是,这几乎从来不是一个好主意。

相反,也许更好的方法是假装任何不使用非托管资源且在程序中没有被任何其他对象访问到的对象立即被销毁。我知道这不是真的发生了,但是在这一点上,该对象仅仅是像任何其他内存块一样的东西;你无法重新获取它,并且它最终将被回收,所以它可能只是对你无用。

关于 IDisposable 的最后一点提示。你应该只对包装非托管资源的类型使用它:像套接字,数据库连接,GDI 对象等以及偶尔的事件/委托订阅。

0