1

我在 C# 中阅读了很多关于using关键字的主题,但我找不到任何有相同问题的人。阅读这篇有趣的文章,它说 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 块中。

这对我来说似乎很奇怪,以至于我认为我一定错过了一些东西。谁能解释一下这背后的原因?

4

1 回答 1

3

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

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

于 2013-10-17T16:25:14.503 回答