函数内部的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()一个需要它的对象。即使该对象是垃圾回收的,也可能有未被释放的非托管资源。调用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
        }
    }
}