Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#和#x27;使用';在循环中阻塞_C# - Fatal编程技术网

C#和#x27;使用';在循环中阻塞

C#和#x27;使用';在循环中阻塞,c#,C#,我想知道在C#中使用“using”块的最佳方法是什么 方法1:在“使用”块内循环 void MyMethod(List<Prod> productList) { using(MyResource mr = new MyResource()) { foreach(Prod product in productList) { //Do something with the resource }

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

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

void MyMethod(List<Prod> productList)
{
    using(MyResource mr = new MyResource())
    {
        foreach(Prod product in productList)
        {
            //Do something with the resource
        }
    }
}
void MyMethod(List<Prod> productList)
{
    foreach(Prod product in productList)
    {
        using(MyResource mr = new MyResource())
        {
        //Do something with the resource
        }
    }
}
void MyMethod(列表产品列表)
{
使用(MyResource mr=new MyResource())
{
foreach(产品列表中的产品)
{
//对资源做点什么
}
}
}
方法2:在“使用”块外循环

void MyMethod(List<Prod> productList)
{
    using(MyResource mr = new MyResource())
    {
        foreach(Prod product in productList)
        {
            //Do something with the resource
        }
    }
}
void MyMethod(List<Prod> productList)
{
    foreach(Prod product in productList)
    {
        using(MyResource mr = new MyResource())
        {
        //Do something with the resource
        }
    }
}
void MyMethod(列表产品列表)
{
foreach(产品列表中的产品)
{
使用(MyResource mr=new MyResource())
{
//对资源做点什么
}
}
}
我想知道哪种方法更可取,为什么。两者之间会有性能差异吗?如果资源是。。。比如说数据库连接还是对象


谢谢

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

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

除非有必要,否则不建议采用方法2

方法1有更好的性能,有创建/销毁的对象(和内存消耗)。尤其是在数据库中,如果存在池连接,则会发生事件。

此:

using(MyResource mr = new MyResource())
{
  //Do something with the resource
}
大致可以这样翻译:

MyResource mr = new MyResource();
try {
  //Do something with the resource
} finally {
  mr.Dispose();
}
但在第一个示例中,在结束的花括号之后,mr不可用


如果你在两个例子中都做了这个替换,你会发现它们是多么的不同。它们可以完成不同的事情——在某些情况下都是有效的。

它决定了资源的范围。使用资源(变量)的外部将被释放


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

这取决于您在使用mr实例的循环中所做的操作,以及mr实例是否可在循环之间重复使用。两者都是非常不同的事情。你如何比较两者?真的没有道理。如果您想为每个项目使用新资源,请使用第二种方法,否则使用第一种方法。如果您的资源是“可重用的”,也就是说,迭代不会使资源处于不重新打开就无法使用的状态,当然,第一种方法更好,因为每次迭代创建一个新对象不会浪费时间和内存,这是一个非常一般的问题。把准确的场景放进去,这样人们就可以提供帮助。@EgorShkorov这不是“当然”,因为你怎么知道编译器不会优化它呢?