【问题标题】:should I really dispose my object before exiting the scope of my method?在退出我的方法范围之前,我真的应该处置我的对象吗?
【发布时间】:2012-12-13 15:31:45
【问题描述】:

我从代码分析中收到 CA2000 错误,要求我在退出范围之前处置我的对象

在方法中失去作用域之前释放对象 'MyMethod(Guid?)',调用 System.IDisposable.Dispose 在对象“人”上的所有引用之前 它超出了范围。

我对这条规则感到惊讶,因为我认为 dispose 在退出范围时会自动运行。注意:A similar question 已被询问并确认我的意见,不要强制执行处置过程。

如果我不处置我的对象并且我不在 using 指令中使用它会发生什么?

【问题讨论】:

  • 你从哪里得到的报价?断章取义,它似乎没有多大意义。只需将您的方法包装在 using 语句中即可。
  • 发布您的代码。只有使用using 才会调用dispose。
  • 这取决于Person的定义。它实现了 IDisposable 表明它应该在 using 块中。
  • 是 Person 实现了 IDisposable。但是,如果我不写使用或处置我的对象怎么办。我的对象会永远存在于记忆中吗?
  • 为什么“当然”。里面有什么东西真的需要处理吗?并且不会自动调用 Dispose。唯一自动调用的是终结器(如果已实现),它将 usually 调用 dispose。但仅当 GC 开始收集时 - 在您的应用程序的生命周期中可能永远不会或经常发生。

标签: c# .net


【解决方案1】:

Dispose 永远不会自动调用。您必须显式调用它,或使用“使用”关键字 至少,如果你不释放你的对象,它可能由垃圾收集器完成,但前提是你实现了正确的模式。

【讨论】:

    【解决方案2】:

    如果您已将对象包装在 using 语句中,则可以,因为它将被转换为。

    try{
        var myObject = new MyObject();
    }finally{
        myObject.Dispose();
    } 
    

    更新

    如果你不处置你的对象,它'可能会永远留在内存中'保留附加的资源。但可能不会。当它试图清除它时,它取决于垃圾收集器。但要注意 GC 只能清除托管资源

    在这里寻找类似的问题:What happens if I don't call Dispose on the pen object?

    【讨论】:

      【解决方案3】:

      我认为 dispose 是在退出范围时自动运行的。

      不是 any 范围,只有 using 块范围。退出方法与退出using 块不同。

      如果一个对象实现了IDisposable,那么您应该始终手动或通过using 块处理它。何时执行此操作取决于您的代码结构。

      【讨论】:

        【解决方案4】:

        当对象超出范围时不调用 Dispose。在许多情况下,它会在垃圾收集对象时被调用(当实现 Finalizer 并在其中调用 Dispose 时)。

        【讨论】:

          猜你喜欢
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-01
          • 2014-05-02
          • 2021-02-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多