繁体   English   中英

在C#中使用语句

[英]using statement in C#

我知道使用语句的目的是在代码块完成后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();
}

为什么我们必须在括号中插入成本资源报表?

我们将要自动分配的资源写在方括号内,以使编译器确切知道我们指的是哪种资源。 如果我们只是让编译器进行猜测,则每次可能都无法正确猜测,因此发现此错误可能非常困难。 假设编译器将释放在using之上声明的第一个一次性资源,然后,如果有人只是在声明和using之间编写了另一个声明,则要处置的资源将发生变化。

必须与using一起编写资源,这是一种非常清晰的方法,可以表明您正在using该资源,否则看起来就像两个不相关的语句。

另一个好处是,如果您在using之外编写声明,则该声明仍在using之外的范围内。 在代码的某些后期部分,您可能会意外地使用一些已被处置的资源。

嗯,这样写在语法上是无效的,主要是因为不清楚在那里将“使用”什么……并且您仍然需要关闭并处置资源以避免潜在的内存泄漏。

另外,请参阅文档中提供的示例,不建议这样做,因为范围内的对象提供了仅在使用封闭的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();

使用旨在清除一次性物品的使用寿命; 它必须与变量关联才能实现此目的。

同样,如果您以推荐的方式声明它,则该语言将使得在处理对象后无法访问该对象:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM