【问题标题】:C# 'using' block inside a loop循环内的 C#“使用”块
【发布时间】:2015-02-27 15:35:47
【问题描述】:

我想知道在 C# 中使用“using”块的最佳方式是什么。

方法 1:在“使用”块内循环

void MyMethod(List<Prod> productList)
{
    using(MyResource mr = new MyResource())
    {
        foreach(Prod product in productList)
        {
            //Do something with the resource
        }
    }
}

方法 2:在“使用”块之外循环

void MyMethod(List<Prod> productList)
{
    foreach(Prod product in productList)
    {
        using(MyResource mr = new MyResource())
        {
        //Do something with the resource
        }
    }
}

我想知道哪种方法更可取以及为什么。两者之间会有性能差异吗?另外,如果资源是……比如数据库连接或对象,它有什么不同?

谢谢!

【问题讨论】:

  • 这取决于您在循环内对 mr 实例执行的操作以及 mr 实例是否可在循环之间重用。
  • 两者是非常不同的东西。你怎么能比较两者?真的没有意义。如果您想为每个项目使用新资源,请使用第二个,否则首先。
  • 如果你的资源是“可重用的”,也就是说,迭代不会将资源置于不重新打开就不能再使用的状态,当然第一种方法更好,因为你不要通过每次迭代创建一个新对象来浪费时间和内存
  • 非常笼统的问题。给出确切的场景,以便人们可以提供帮助。
  • @EgorShkorov 这不是“当然”,因为你怎么知道编译器不会优化它?

标签: c#


【解决方案1】:

在方法 1 中,您为循环创建一次资源。

在方法 2 中,您为产品列表中的每个产品创建一个新资源。

除非必要,否则不建议使用方法 2。

方法 1 具有更好的性能,有创建/销毁的发烧对象(和消耗的内存)。特别是如果它是一个数据库,如果有一个池连接的事件。

【讨论】:

    【解决方案2】:

    这个:

    using(MyResource mr = new MyResource())
    {
      //Do something with the resource
    }
    

    大致翻译为:

    MyResource mr = new MyResource();
    try {
      //Do something with the resource
    } finally {
      mr.Dispose();
    }
    

    除了在第一个示例中,mr 在右大括号之后不可用。

    如果您在两个示例中都进行了此替换,您会发现它们有多么不同。它们完成不同的事情 - 在某些情况下两者都有效。

    【讨论】:

      【解决方案3】:

      它决定了该资源的范围。除了使用资源(变量)之外,将被处理。

      所以这取决于您的使用情况。通常“使用”用于创建和处置连接,以确保在所需操作后正确关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多