返回后我应该在函数内调用Dispose()吗?

时间:2010-05-14 09:19:04

标签: c# .net vb.net dispose idisposable

我应该在返回实现IDisposable的对象后调用.Dispose()吗?

myDisposableObject Gimme() {
  //Code
  return disposableResult;
  disposableResult.Dispose();
}

换句话说,对象是我返回一个副本,还是对象本身?谢谢:))

12 个答案:

答案 0 :(得分:9)

不,你不应该。您返回对该对象的引用,因此没有复制。在.NET中,除非您特别要求,否则永远不会复制对象。

此外,即使存在应该使用的情况,也不能使用类似的代码处理对象。 return语句之后的代码将永远不会执行,您将收到有关无法访问代码的警告。

答案 1 :(得分:8)

这是对象本身。不要在这里调用Dispose,即使你颠倒顺序以便调用它。

答案 2 :(得分:7)

到目前为止,没有一个答案提到的一件事是,如果Gimme抛出异常,你应该处理对象。例如:

MyDisposableObject Gimme() 
{
    MyDisposableObject disposableResult = null;
    try
    {
        MyDisposableObject disposableResult = ...

        // ... Code to prepare disposableResult

        return disposableResult;
    }
    catch(Exception)
    {
        if (disposableResult != null) disposableResult.Dispose();
        throw;
    }
}

答案 3 :(得分:4)

disposableResult.Dispose();将永远不会运行,它是无法访问的代码,因为它将始终返回该行。将方法调用包装在一个使用方法中并以这种方式处理该对象 e.g。

using (DisposeableObject myDisposableObject = gimme())
{
    //code.
}

答案 4 :(得分:3)

无论如何都永远不会达到.Dispose()

编辑:在我看来,不,你不应该。你用它破坏了对象。

答案 5 :(得分:3)

如果您使用的对象实现IDisposable,则应在using语句中构造和使用 - 这将确保它被正确处理:

using(var mydisposableObject = new Gimme())
{
   // code
}

构建代码的方式是,您返回一次性对象,因此永远不会调用Dispose

答案 6 :(得分:2)

如果您返回该对象,则在返回之前应处理该对象。必须由呼叫者来处理它。

答案 7 :(得分:1)

此行:disposableResult.Dispose();将不会被执行。返回的“东西”不是对象的副本。它是对象的引用,因此调用者将操纵在Gimme中创建的对象,并且他(调用者)应该记住处置该对象。

答案 8 :(得分:1)

您可以将代码包装在try / finally块中

    try{
            int a = 0;
            return;
    }
    finally{
            //Code here will be called after you return
    }

答案 9 :(得分:1)

我同意不要处理它通过引用传递的这个对象。当产生一个类包装另一个类并分配对象时,我可以想到一个特殊的情况:你不希望分配的对象是一个引用同一个,以便您克隆或传递对象的副本并销毁原始对象,但是如果原始对象是该类型的所有生成的标准图像,则不会专门为每个调用创建对象,并且您预期会产生数字。您可能希望保留它的一小段时间,因为您可以从该图像生成一个新对象,而无需再次实例化它。我会选择将此处的所有属性锁定为只读并将只读对象转换为读/写可以在reallworld中使用的对象。当它作为值复制或克隆传递时,该对象不应该在其自身内运行任何线程,但是如果它是线程,只要引用是1对1的关系,如果你有多个指针,那么传递它的引用是完全正确的。对于同时读取和写入“正在运行的图像”对象的对象,您可能会开始在没有安全存储值的情况下进行冲突,并且下一个pinger请求并分配相同的值。我在学校学到很大程度上没有讨论的一件事是对象状态。面向对象的主体是根深蒂固的,但理解它们为什么建立起来总是需要时间..我是后面的词我学会了面向对象的风格然后转向更多的程序风格。

答案 10 :(得分:0)

myDisposableObject disposableResult = new myDisposableObject();

此处disposableResult是对创建的新对象的引用。因此,当您返回对调用方法的引用时,该引用仍然指向堆中创建的对象。因此,您可以安全地将其置于调用方法中。

答案 11 :(得分:0)

你不能在返回的方法中使用.Dispose()。调用者应该实现它。