C# 在C语言中使用语句

C# 在C语言中使用语句,c#,C#,我知道使用语句的目的是CLR在代码块完成时释放内存, 所以 将被翻译为: MyResource myRes= new MyResource(); try { myRes.DoSomething(); } finally { // Check for a null resource. if (myRes!= null) // Call the object's Dispose method. ((IDisposable)myRes).Disp

我知道使用语句的目的是CLR在代码块完成时释放内存, 所以

将被翻译为:

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();
}
但我仍然有一个问题,为什么使用语句的语法不象:

MyResource myRes = new MyResource();
using {
   myRes.DoSomething();
}

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

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

另外,请参阅文档中提供的示例,不推荐使用该示例,因为范围内的对象提供了仅在使用关闭的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上面声明的第一个一次性资源,那么如果有人只是在声明和using之间编写另一个声明,那么要释放的资源将发生变化

必须将资源与using一起编写,这是一种非常清楚的方式来表明您正在使用该资源,否则它看起来就像两个不相关的语句


另一个优点是,如果您在using之外编写声明,那么声明仍然在using之外的范围内。在代码后面的某些部分,您可能会意外地使用一些已处置的资源。

使用意味着清除一次性对象的有用寿命;它必须与一个变量相关联才能达到这个目的

此外,如果您以建议的方式声明该对象,则该语言会使该对象在被处置后无法访问:

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

也许您不想在using语句中处理所有可丢弃的内容。如上所述,如果您分配三个资源,例如,编译器如何知道要处理哪些资源?您不必使用using。你可以直接打电话给Dispose。使用语法是很有帮助的,因为它明确了一次性变量的有用范围,并且与该变量相关。他们可以考虑很多模式,但这是他们选择的模式。这是因为DoSomething不是一次性的,而是包含实例的
var myRes= new Resource();
using
{
    myRes.Foo();
}
myRes.Bar(); //Compiles; allows access to disposed object, which is usually bad