C# 函数中的Dispose方法是否重要?
所以最近我一直在处理一次性对象,我想知道在函数中处理对象是否有益? 与这两个函数类似,函数中使用.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()需要
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
。