我知道use语句的目的是CLR在代码块完成时释放内存, 所以
using (MyResource myRes = new MyResource())
{
myRes.DoSomething();
}
将被翻译为:
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();
}
但是我仍然有一个问题,为什么using语句的语法不像这样:
MyResource myRes = new MyResource();
using {
myRes.DoSomething();
}
为什么我们必须在圆括号中插入成本资源声明?
答案 0 :(得分:1)
我们将要自动分配的资源写在方括号内,以使编译器确切知道我们指的是哪种资源。如果我们只是让编译器进行猜测,则每次可能都无法正确猜测,因此发现此错误可能非常困难。假设编译器将释放using
上方声明的第一个一次性资源,然后,如果有人只是在声明和using
之间写了另一个声明,则要处置的资源将发生变化。
必须将资源与using
一起写在一起,这是一种非常清晰的方法,可以证明您using
是该资源,否则看起来就像两个不相关的语句。
另一个优点是,如果您在using
之外编写声明,则该声明仍在using
之外的范围内。在代码的稍后部分,您可能会意外地使用一些已经处置的资源。
答案 1 :(得分:0)
这样写,在语法上是无效的,主要是因为不清楚在那里将“使用”什么,并且您仍然需要关闭并处置资源以避免潜在的内存泄漏。
另外,请参阅文档中提供的示例,因为不建议使用范围内的对象,所以只有在使用封闭的IDisposable
资源时才能在运行时捕获错误,因此不建议使用该示例
Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
// use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight();
答案 2 :(得分:0)
使用旨在清除一次性物品的使用寿命;它必须与变量关联才能实现此目的。
此外,如果您以推荐的方式声明它,则该语言将使其无法在对象被处置后对其进行访问:
using (var myRes = new Resource())
{
myRes.Foo();
}
myRes.Bar(); //Will not compile due to "name does not exist in the current context"
如果我们按照您的方式做,编译器将不会阻止这种错误:
var myRes= new Resource();
using
{
myRes.Foo();
}
myRes.Bar(); //Compiles; allows access to disposed object, which is usually bad