我在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块内部进行初始化。
这对我来说似乎很奇怪,我认为我必须遗漏一些东西。有人能解释一下这背后的原因吗?
答案 0 :(得分:3)
如果构造函数失败,将抛出异常而不是返回引用 - 因此调用代码无需处理。
基本上,构造者需要小心。如果在异常中抛出异常,构造函数需要确保没有泄漏任何资源,因为没有其他任何东西可以清除。