我的问题:使用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>");
}
答案 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()
方法中的另一个异常。
除此之外,您通常应该尝试将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();
}
所以我们最好使用使用模式