使用使用Better?

时间:2011-01-06 14:11:16

标签: c# syntax

  

可能重复:
  What is the C# Using block and why should I use it?

我的问题:使用using(a){do something with a}比声明'a'更好并以这种方式使用它。即:更安全,更快,......

参见示例澄清。

示例1 :(不使用)

StreamWriter sw;
string line;
sw = new StreamWriter("D:\\NewCon.xml");
sw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
sw.WriteLine("<config>");
for (int i = 0; i >=36; i++)
{
    line = "";
    line = "<" + xmlnodes[i] + ">";
    line += vals[i];
    line += "</" + xmlnodes[i] + ">";
    sw.WriteLine(line);   
}
sw.WriteLine("</config>");
sw.Close();
sw.Dispose();    

示例2 :(使用时)

string line;    
using (sw = new StreamWriter("D:\\NewCon.xml"))
{
    sw.WriteLine("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
    sw.WriteLine("<config>");
    for (int i = 0; i >= 36; i++)
    {
        line = "";
        line = "<" + xmlnodes[i] + ">";
        line += vals[i];
        line += "</" + xmlnodes[i] + ">";
        sw.WriteLine(line);
    }
    sw.WriteLine("</config>");
}

8 个答案:

答案 0 :(得分:11)

  

使用(a){做一些事情}

这意味着当代码块用a完成时,程序将调用a.Dispose。你知道即使在发生异常的情况下,也会调用Dispose。它本质上是这样做的:

var a = IDisposable_Something;
try{.....}finally{a.Dispose();}

它更安全......不是真的,但那不是重点。其重点是确保在程序完成后立即完成需要清理的资源。

所以你的第一个例子的问题是,如果在该行的某个地方抛出异常,它将不会进入Dispose()方法。第二个会。你总是希望确保Dispose被调用,因为有可能IDisposable类没有被正确编写,并且它没有代码来确保非托管资源被清除,即使未调用Dispose()(通常在终结器中完成)。 LInk to Dispose Pattern.

我唯一一次看到实现使用的方法可能很棘手,因为WCF服务代理(你可以解决这个问题)。有一个错误,如果代理有时会抛出异常,它将导致Dispose()方法中的另一个异常。

http://blogs.msdn.com/b/jjameson/archive/2010/03/18/avoiding-problems-with-the-using-statement-and-wcf-service-proxies.aspx

除此之外,您通常应该尝试将IDisposable对象放入using语句中。

答案 1 :(得分:6)

如果您的第一个示例中引发了异常,则不会处理该资源。

使用using可确保即使抛出异常也会处置资源。

答案 2 :(得分:2)

永远不应该执行示例1。如果抛出异常,您的Dispose()呼叫将永远不会发生,这可能是不好的。 using保证执行Dispose()。示例1(除using之外)唯一的好选择是:

var iDisposableObject = new YourDisposableConstructor();
try
{
    // some code
}
finally
{
    iDisposableObject.Dispose();
}

答案 3 :(得分:1)

首先,示例1中的代码应该包含在try / finally块中,以便在功能上与示例2中的代码等效。

那就是说,我总是喜欢'使用'块代码这样的代码。我认为它通常会导致代码更易读。就安全性或性能而言,您不会在示例1和示例2之间看到太多差异,只要您在第一个示例中使用try / finally块!

答案 4 :(得分:0)

在某种意义上它更安全,你不会忘记处理资源,特别是在异常的情况下(你的代码目前没有捕获任何代码)。

由于您使用较少的代码行并且代码的意图变得更加清晰,因此它更加简洁和惯用。

所以这个:

StreamWriter sw;
try
{
sw = new StreamWriter("D:\\epkDATA\\NewCon.xml");
...
}
finally 
{
 sw.Dispose();
}

相当于:

using(StreamWriter sw = new StreamWriter("D:\\epkDATA\\NewCon.xml"))
{
 ...
}

答案 5 :(得分:0)

使用using更安全,因为即使发生任何错误或意外退出,您也可以保证在使用(...)括号中声明的资源释放。

答案 6 :(得分:0)

添加到之前的答案,以及发生异常的最重要部分,保证调用dispose()

答案 7 :(得分:0)

如果ClassA继承自IDisposing.A“using”模式等于以下内容:

IDisposable iDisposableObject = new YourDisposableConstructor();
try
{
    // some code
}
finally
{
    iDisposableObject.Dispose();
}

所以我们最好使用使用模式