在C#中使用语句

时间:2019-02-12 06:16:04

标签: c#

我知道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();
}

为什么我们必须在圆括号中插入成本资源声明?

3 个答案:

答案 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