函数中的 Dispose 方法重要吗?

does the Dispose method inside a function matters?

所以最近我一直在使用一次性对象,我想知道在函数中处理对象是否有益? 在这两个函数之间,使用 .Dispose() 在函数内部真的很重要,因为函数中的所有对象一旦完成

就会消失
void FOO()
{
    var x= new DisposableObject();
    //stuff
}

void FOO()
{
    using(var x= new DisposableObject())
    {
        //stuff
    }
}

你应该总是Dispose()一个需要它的对象。即使对象被垃圾回收,也可能存在未释放的非托管资源。调用 Dispose()(或第二个示例中的 using)确保对象可以正确释放它需要的非托管资源。

物体不会简单地消失。

GC 收集不再引用的实例。这可能需要一些时间,因为 GC 会决定何时 运行 并且在它完成之前不会处理该实例。

如果此一次性资源具有非托管资源并正确实施,则资源将由单线程终结器处理。

如果您可以接受一段时间内未处理实例并且终结器不忙......那么请继续。不过还是尽快处理掉比较好。

All objects within a function will vanish as soon as it finishes

对象将保留,本地引用将消失。当垃圾收集器 运行 时,对象将 'vanish' 并确定它们无法访问。

在从内存中删除无法访问的对象之前,它的终结器将运行(如果已实现)清除所有非托管资源。

问题是所有这些都不是确定性的。你永远不知道 GC 什么时候会 运行,在某些情况下甚至不会执行终结器。

如果可能,您应该始终调用 Dispose 方法。

如果您想了解有关终结器的更多详细信息,您应该阅读这两篇文章:part 1, part 2

在 Dispose() 方法中设置断点并 运行 这些测试与调试。 TestMethod1 未命中断点,而 TestMethod2 命中断点。

正如其他人所指出的,这是因为 GC 在 .Net 中的工作方式 如果您要实现 IDiisposeable 接口,您可能希望将 class 放在 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
        }
    }
}