using statement in C#

Refresh

February 2019

Views

53 time

-2

I know the purpose of using statement is that CLR release memory as the code block finishes, so

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

}

will get translated to :

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

But I still have a question, why is the syntax of using statement not like:

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

why we have to insert the cost resource statement in the round brackets?

2 answers

1

Напишу ресурс , который мы хотим автоматически распоряжаться внутри скобок , чтобы компилятор точно знать , какой ресурс мы имеем в виду. Если мы просто дайте догадку компилятора, он не может правильно угадать каждый раз, и пятнистость этой ошибки может быть очень трудно. Допустим, компилятор будет выпустить первый одноразовый ресурс заявленный выше using, то ресурс , который должен быть расположен изменится, если кто - то просто пишет другое заявление между Декларацией и using.

Имея писать ресурс «вместе» с usingочень ясным способом , чтобы показать , что вы usingэтот ресурс, иначе он просто выглядит как два не связанных между собой утверждений.

Еще одно преимущество заключается в том, что если вы напишете заявление , вне из using, декларация по - прежнему в рамках за пределами using. В некоторых более поздних частях вашего кода, вы могли бы быть случайно с помощью какого - либо ресурса , который уже удален.

0

Ну, это не синтаксически правильным быть написаны так, в основном потому, что не ясно, что вы могли бы быть «с помощью» там ... и вы все еще нужно закрыть и распоряжаться ресурсами, чтобы избежать потенциальной утечки памяти.

Кроме того , см пример , приведенный в документации, которая не рекомендуется , так как объект , находясь в области видимости предоставляет возможности для ошибок только catchable во время выполнения при использовании закрытых 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();