2013-10-17 82 views
0

我读了很多关于C#中关键字using的帖子,但我找不到任何人有同样的问题。 阅读this有趣的文章,它说,使用的语句基本上等同于一个try/catch块:使用初始化内部的异常

MyResource myRes= new MyResource(); 
try 
{ 
    myRes.DoSomething(); 
} 
finally 
{ 
    // Check for a null resource. 
    if (myRes!= null) 
     // Call the object's Dispose method. 
     ((IDisposable)myRes).Dispose(); 
} 

真正让我要疯了是对象初始化myRes= new MyResource()仍是try/catch块的外,所以如果在初始化过程中出现问题(哦,它确实!)我没有其他办法来处理它比使用正常的try/catch块。

这是正确的还是我错过了什么?在我看来,这使得声明部分无用。

我也尝试过这样的事情:

using (MyResource myRes) 
{ 
    myRes = new MyResource(); 
    myRes.DoSomething(); 
} 

但是编译器不喜欢这个,所以无法使初始化try块内。

这对我来说似乎很奇怪,我认为我必须错过一些东西。任何人都可以解释我背后的原因吗?

+0

如果'new MyResource();'失败,'myRes'仍然为'null',那么您想要“处置”? –

回答

3

那么如果构造函数失败,将抛出异常而不是返回引用 - 所以调用代码没有任何可处置的。

基本上,构造函数需要小心。如果在异常中引发异常,那么构造函数需要确保没有资源泄漏,因为没有其他事情会得到清理的机会。

+0

这是有道理的。所以我会说,当构造函数可能抛出一个异常时,避免使用'using'并将其放在try/catch/finally块中是个好习惯。正确? – bluewaves

+0

@bluewaves:不,我认为你错过了这一点。使用'try/catch/finally'模块不会对你有所帮助,因为你仍然没有任何东西需要处理。你认为它会给你什么好处? –

+0

当然,我不会有任何东西需要处理,但我会抓住这个异常,并且我的程序不会崩溃。如果我只使用'using'块,则初始化中的异常将导致未捕获的异常。 – bluewaves