函数内的Dispose方法是否重要?

时间:2015-11-06 20:35:40

标签: c# function dispose idisposable

最近我一直在处理一次性物体,我想知道将一个物体放在一个功能中是否有用? 在这两个函数之间使用 .Dispose()在函数内部非常重要,因为函数中的所有对象一旦完成就会消失

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

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

对象不会简单地消失。

GC会收集不再引用的实例。这可能需要一些时间,因为GC决定何时运行,并且实例将不会被处理,直到它发生。

如果此一次性使用非托管资源并且正确实现,则资源将由终结器处理,该终结器是单个线程。

如果您对该实例未被处理一段时间并且终结器不忙,那么请继续。但如果你尽快处理它会好得多。

答案 2 :(得分:2)

  

函数中的所有对象一旦完成就会消失

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

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

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

如果可行的话,您应该始终致电Dispose方法。

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

答案 3 :(得分:1)

在Dispose()方法中设置断点并使用调试运行这些测试。 在TestMethod2执行时,TestMethod1没有到达断点。

正如其他人所说,这是因为GC在.Net中的运作方式 如果您要实现IDiisposeable接口,您可能希望将您的类放在using语句中或调用.Dispose(),以便您有更可预测的应用程序行为。

protected void pickFile(View view){

    ///Codigo que abre la galeria de imagenes y carga la imagen en displayedImage

    Intent intent = new Intent();
    intent.setType("file/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Choose File to Upload"), 1);

}

//It's executed when leaving file system
@Override
protected void onActivityResult(int reqCode, int resCode, Intent data){
    super.onActivityResult(reqCode, resCode, data);

    if (reqCode == 1 && resCode == RESULT_OK && data != null) {
        Uri selectedFile = data.getData();
        RequestMaker.uploadFile(this, selectedFile, "this is a file");
    }
}