C# 函数中的Dispose方法是否重要?

C# 函数中的Dispose方法是否重要?,c#,function,dispose,idisposable,C#,Function,Dispose,Idisposable,所以最近我一直在处理一次性对象,我想知道在函数中处理对象是否有益? 与这两个函数类似,函数中使用.Dispose()非常重要,因为函数中的所有对象都将在函数完成后立即消失 void FOO() { var x= new DisposableObject(); //stuff } void FOO() { using(var x= new DisposableObject()) { //stuff } } 您应该始终Dispose()需要

所以最近我一直在处理一次性对象,我想知道在函数中处理对象是否有益? 与这两个函数类似,函数中使用.Dispose()非常重要,因为函数中的所有对象都将在函数完成后立即消失

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

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

您应该始终
Dispose()
需要它的对象。即使对象是垃圾收集的,也可能存在无法释放的非托管资源。调用
Dispose()
(或者像第二个示例中那样使用
调用
)可以确保对象可以正确释放它需要的非托管资源。

对象不会简单地消失

GC收集不再引用的实例。当GC决定何时运行时,这可能需要一些时间,而实例在运行之前不会被释放

如果此一次性资源具有非托管资源并且正确实现,则资源将由终结器(单线程)进行处置

如果您同意一段时间内不处理实例,并且终结器不忙。。那就去吧。但是如果你尽快处理掉它会好得多

函数中的所有对象将在函数完成后立即消失

对象将保留,局部引用将消失。当垃圾收集器运行并确定无法访问时,对象将“消失”

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

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

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


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

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

正如其他人所指出的,这是因为GC在.Net中的工作方式 如果要实现IDisPoseable接口,可能需要将类放入using语句或call.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
        }
    }
}

如果类的实现正确,终结器也将清理这些非托管资源。@i3arnon请看这个:@i3arnon不一定,而且您甚至不能保证终结器将对所有对象运行。@itsme86如果进程崩溃或卸载,您也不能保证finally块的执行。当然,优先选择尽快处理,但不是强制性的(例如任务)。GC永远不会调用
Dispose
,它将调用终结器,而终结器应依次调用
Dispose