哪一个结构更好?
class Program
{
static void Main(string[] args)
{
try
{
using (Foo f = new Foo())
{
//some commands that potentially produce exceptions.
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
...或
class Program
{
static void Main(string[] args)
{
using (Foo f = new Foo())
{
try
{
//some commands that potentially produce exceptions.
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
答案 0 :(得分:7)
要么是好的,取决于你将要捕获的内容。如果你需要在catch中使用f
,那么它需要在using语句中。但是在你的例子中没有区别。
编辑:
正如其他地方所指出的那样,它还取决于您是否尝试在使用或包含using语句中的对象创建之后捕获块中生成的异常。如果它在使用之后的块中那么它就像我描述的那样。如果要捕获Foo f = new Foo()
生成的异常,则需要使用第一种方法。
答案 1 :(得分:2)
我认为这不重要,性能方面。但是有一点点差异;在第二个示例中,f
仍然在异常处理程序中可用,而在第一个示例中,它已超出范围。相反,在第一个示例中,将捕获Foo
构造函数中的异常及其Dispose
方法,而在第二个示例中,它们不会。
可能是也可能不是你想要的。
答案 2 :(得分:1)
查看此帖子以便更好地了解:http://www.ruchitsurati.net/index.php/2010/07/28/understanding-%E2%80%98using%E2%80%99-block-in-c/
同时阅读此问题的答案:Catching exceptions thrown in the constructor of the target object of a Using block
第一个是下一个
class Program
{
static void Main(string[] args)
{
try
{
using (Foo f = new Foo())
{
//some commands that potentially produce exceptions.
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
因为如果你看到这个try和catch块的IL代码没有包装对象的inialization。
答案 3 :(得分:1)
第一个更好,因为它将捕获在处置过程中抛出的任何异常。当然,在处理时你不应该抛出任何异常,但事情会发生。
答案 4 :(得分:1)
第一个是更好的一个。如果有任何异常,它将会捕获。
try
{
using (Foo f = new Foo())
{
//some commands that potentially produce exceptions.
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
使用的概念是它将处理在using.i.e中创建的对象,它会自动调用IDispose方法。根据要求使用using。
答案 5 :(得分:1)
使用只是
Foo f = null;
try
{
f = new Foo();
}
finally
{
if (f is IDisposable)
f.Dispose();
}
看到你可以实现捕获这样的异常:
Foo f = null;
try
{
f = new Foo();
}
catch (Exception ex)
{
// handle exception
}
finally
{
if (f is IDisposable)
f.Dispose();
}