代码之家  ›  专栏  ›  技术社区  ›  Camilo Martin

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

  •  9
  • Camilo Martin  · 技术社区  · 15 年前

    在返回实现IDisposable的对象之后,是否应该调用.dispose()?

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

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

    12 回复  |  直到 12 年前
        1
  •  8
  •   Marcelo Cantos    15 年前

    它是物体本身。不要在这里调用Dispose,即使您颠倒了顺序以便调用它。

        2
  •  9
  •   Guffa    15 年前

    不,你不应该这样做。你返回一个对象的引用,所以没有复制。在.NET中,除非您明确要求,否则永远不会复制对象。

    此外,即使在某些情况下您应该这样做,也不能用这样的代码来处理对象。后面的代码 return 语句将永远不会执行,并且您将收到关于无法访问代码的警告。

        3
  •  7
  •   to StackOverflow    15 年前

    到目前为止还没有人提到的一件事是你 应该 如果gimme引发异常,则释放该对象。例如:

    MyDisposableObject Gimme() 
    {
        MyDisposableObject disposableResult = null;
        try
        {
            MyDisposableObject disposableResult = ...
    
            // ... Code to prepare disposableResult
    
            return disposableResult;
        }
        catch(Exception)
        {
            if (disposableResult != null) disposableResult.Dispose();
            throw;
        }
    }
    
        4
  •  4
  •   Shimmy Weitzhandler 500 - Internal Server Error    13 年前

    DisposableResult.Dispose();将永远不会运行,因为它总是返回前面的行,所以它是不可访问的代码。用using语句包装方法调用,并以这种方式处置对象。
    例如

    using (DisposeableObject myDisposableObject = gimme())
    {
        //code.
    }
    
        5
  •  3
  •   Bobby    15 年前

    这个 .Dispose() 无论如何都无法联系到。

    编辑: 在我看来,不,你不应该这样做。你会用它摧毁物体的。

        6
  •  3
  •   Oded    15 年前

    如果您使用的对象是工具 IDisposable ,您应该在 using 语句-这将确保正确处理它:

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

    代码的构造方式是返回可释放对象,因此调用 Dispose 永远无法联系到。

        7
  •  2
  •   erikkallen    15 年前

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

        8
  •  1
  •   prostynick    15 年前

    这条线: disposableResult.Dispose(); 不会执行。返回的“thing”不是对象的副本。它是对对象的引用,因此调用方将对在中创建的对象进行操作。 Gimme 他(调用者)应该记住处理对象。

        9
  •  1
  •   James    15 年前

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

        try{
                int a = 0;
                return;
        }
        finally{
                //Code here will be called after you return
        }
    
        10
  •  1
  •   alignedfibers    12 年前

    我同意不要处理这个对象,它是通过引用传递的。当一个类包装另一个类并分配对象时,我可以想到一个特殊的情况:您不希望分配的对象是对同一个类的引用,因此您克隆或传递对象的副本并销毁原始图像,但是如果原始图像是该类型所有生成的标准图像,则该对象不是T是专门为每个调用创建的,您可以在很短的时间内预测numerouse的生成,因为您可以从该图像生成一个新的对象,而无需再次实际实例化它。我将选择将此上的所有属性锁定为只读,并将只读对象强制转换为可在reallworld中使用的读/写对象。当对象作为值copy或clone传递时,它本身不应该运行任何线程,但是如果它正在线程化,只要引用是1对1的关系,就可以传递它的引用,如果有多个指针指向一个同时读写该“正在运行的映像”对象,则可能是如果一个值没有被安全地存储,那么轧棉机将进行合并,下一个Pinger将请求并分配相同的值。有一件事我们在很大程度上没有讨论,那就是对象状态。面向对象的原则是根深蒂固的,但是理解它们为什么被建立总是需要时间。我是背景词,我学习了面向对象的风格,然后转向了更为程序化的风格。

        11
  •  0
  •   Amsakanna    15 年前

    myDisposableObject disposableResult = new myDisposableObject();

    在这里 disposableResult 是对创建的新对象的引用。因此,当您返回对调用方法的引用时,该引用仍然指向堆中创建的对象。因此,您可以在调用方法中安全地处理它。

        12
  •  0
  •   renjucool    15 年前

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