Сохраняет ли блок using объект живым?


Для некоторых модульных тестов я хочу установить CurrentCulture в определенную культуру (а затем отменить эти изменения позже). Поскольку мне нужно сделать это в нескольких местах, я думал о написании класса CultureChanger, который сохраняет старую культуру и устанавливает новую культуру в своем конструкторе, а затем сбрасывает старую культуру во время ее удаления.

Тогда я мог бы использовать его следующим образом:

using(new CultureChanger(culture)){  
    //some code and assertions with no references to the CultureChanger 
}

Если я это сделал, есть ли риск, что CultureChanger может быть очищен когда-нибудь до того, как использование блока завершает?

3 2

3 ответа:

CultureChanger не будет очищаться до тех пор, пока блок using не завершится.

Блок using определяет область видимости объекта во многом так же, как это делает метод.

Нет никакой гарантии на , Когда объект будет собирать мусор после выполнения блока, но это не произойдет раньше.

Оператор Using обеспечивает удобный синтаксис, обеспечивающий правильное использование объектов IDisposable.

Оператор using вызывает метод Dispose для объекта правильным образом, и (когда вы используете его, как показано ранее) он также заставляет сам объект выходить из области видимости, как только Dispose вызывается. В блоке using объект доступен только для чтения и не может быть изменен или переназначен.

Оператор using гарантирует, что Dispose вызывается, даже если исключение возникает при вызове методов для объекта.

Экземпляр CultureChanger будет оставаться "живым" на протяжении с помощью блока и его метод Dispose будет вызван на закрывающей фигурной скобкой '}' с помощью заявления. Поэтому ответ на ваш вопрос таков: нет никакого риска, что CultureChanger может быть очищен.