函数内部的Dispose方法是否重要
本文关键字:是否 方法 Dispose 内部 函数 | 更新日期: 2023-09-27 18:20:51
最近我一直在处理一次性对象,我想知道在函数中处理对象是否有益?这两个函数之间的区别是.Dispose()在函数内部非常重要,因为函数中的所有对象在完成后都会消失
void FOO()
{
var x= new DisposableObject();
//stuff
}
void FOO()
{
using(var x= new DisposableObject())
{
//stuff
}
}
您应该始终Dispose()
一个需要它的对象。即使该对象是垃圾回收的,也可能有未被释放的非托管资源。调用Dispose()
(或第二个示例中的using
)可确保对象能够正确释放所需的非托管资源。
一旦完成,函数中的所有对象都将消失
对象将保留,本地引用将消失。当垃圾收集器运行并确定对象不可访问时,这些对象将"消失"。
在从内存中删除不可访问的对象之前,它的终结器将运行(如果已实现),清除所有非托管资源。
问题是,所有这些都不是确定性的。您永远不知道GC何时运行,在某些情况下甚至不会执行终结器。
如果可能的话,您应该始终调用Dispose
方法。
如果您想要更多关于终结器的详细信息,您应该阅读以下两篇文章:第1部分,第2部分。
对象不会简单地消失。
GC收集不再被引用的实例。这可能需要时间,因为GC决定何时运行,并且在运行之前不会释放实例。
如果此一次性使用具有非托管资源并且实现正确,则资源将由作为单个线程的终结器进行处置。
如果您对实例在一段时间内未被处理并且终结器不忙感到满意。。然后继续。但如果你能尽快处理掉它会好得多。
在Dispose()方法中设置一个断点,并通过调试运行这些测试。TestMethod1未达到断点,而TestMethod2达到断点。
正如其他人所指出的,这是因为GC在.Net中的工作方式如果要实现IDiisposeable接口,您可能希望将类放在using语句或调用.Dispose()中,这样您就有了更可预测的应用程序行为。
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject2
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var disposable = new DisposableObject();
disposable.DoSomething();
}
[TestMethod]
public void TestMethod2()
{
using (var disposable = new DisposableObject())
{
disposable.DoSomething();
}
}
}
public class DisposableObject : IDisposable
{
public void Dispose()
{
// dispose here
}
public void DoSomething()
{
// do something here
}
}
}