使用初始化内部异常

时间:2013-10-17 16:23:12

标签: c# .net using

我在C#中阅读了许多关于using关键字的主题,但我找不到任何有相同问题的人。 阅读this有趣的文章,它说using语句基本上等同于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语句的意义部分无用。

我也试过这样的事情:

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

但编译器不喜欢这样,因此无法在try块内部进行初始化。

这对我来说似乎很奇怪,我认为我必须遗漏一些东西。有人能解释一下这背后的原因吗?

1 个答案:

答案 0 :(得分:3)

如果构造函数失败,将抛出异常而不是返回引用 - 因此调用代码无需处理。

基本上,构造者需要小心。如果在异常中抛出异常,构造函数需要确保没有泄漏任何资源,因为没有其他任何东西可以清除。