代码之家  ›  专栏  ›  技术社区  ›  T.Todua Laurent W.

何时需要一次性元件的“使用”语句?

  •  -6
  • T.Todua Laurent W.  · 技术社区  · 8 年前

    我知道下面的情况, using 释放一次性元件,即。

    using (StreamReader sr = StreamReader(filename)) 
    {
        txt = sr.ReadToEnd();
    }
    

    然而,如果我内联使用它,会发生同样的情况吗?如您所见,我没有将其定义为变量:

     txt = (StreamReader(filename)).ReadToEnd(); 
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Blorgbeard    8 年前

    定义或不定义变量并不影响是否需要处理对象。

    如果实现 IDisposable 已创建,您应该调用 Dispose 当你完成它的时候。

    你可以用 using 或手动调用 处置 -a 使用 陈述通常更方便、更简单。

        2
  •  1
  •   Scott Perham    8 年前

    首先,dispose方法允许类的开发人员(在本例中 System.IO.StreamReader )释放他们可能持有的任何非托管资源(许多人使用它进行一般清理)。

    通常,如果类实现 IDisposable (因此包含Dispose方法)应该最明确地调用它。

    这个 using 您在上面使用的语句将编译为以下内容:

    //Very roughly your code sample
    using (var sr = new StreamReader())
    {
        //Some code
    }
    
    //What gets spat out by the compiler
    var sr = new StreamReader();
    try
    {
        //Some code
    }
    finally
    {
        sr.Dispose();
    }
    

    如您所见,此模式意味着无论 //Some code 节引发not异常。

    本质上,它是一个C#助手,因此您不必编写 安全 上述代码确保一次性物品的处置。

    因为有明显的好处,问题应该是“什么时候 不应该 您可以使用“”。

        3
  •  1
  •   EJoshuaS - Stand with Ukraine    8 年前

    同样的事情 在第二个示例中发生,就像在第一个示例中发生一样。在第二个示例中,StreamReader将成为 有资格的 因为您没有将垃圾收集存储在变量中(因此它将超出范围),所以在该行执行之后立即执行垃圾收集。这里的关键词是“合格”-无法保证对象何时实际清理。因此,第二行代码将导致对文件的锁定被“保留”,直到垃圾收集器开始对StreamReader进行垃圾收集。

    另一方面,如果你打电话 Dispose() StreamReader ,它将立即释放文件上的锁,而无需等待垃圾收集器。