Справочное руководство по С# определяет синтаксис использования операторов как:
using-statement:
using ( resource-acquisition ) embedded-statement
resource-acquisition:
local-variable-declaration
expression
Может ли кто-нибудь предоставить мне пример, который использует выражение внутри оператора using. В обычных примерах используется объявление переменной.
Пример использования выражения следующий:
var stream = new MemoryStream();
using(stream)
{
//Perform operations with stream here.
}
//Stream is now disposed.
Здесь переменная stream
объявляется вне использования, но завершается использованием. Затем он будет удалять переменную stream
после завершения.
Это не очень общий шаблон, но он полезен для того, где вам может потребоваться выполнить другие операции над ресурсом после его удаления.
Это можно использовать с вызовами методов и т.д. По существу можно использовать любое выражение, которое оценивает тип IDisposable
. Как правило, отсутствие доступа к IDisposable
внутри оператора using не так уж и полезно.
Единственный сценарий, в котором я видел это, используется в ASP.NET MVC с помощью таких помощников формы.
@using(Html.BeginForm())
{
@Html.TextBox("Name");
}
Пример:
//Create the file.
using (FileStream fs = File.Create(path))
{
AddText(fs, "This is some text");
AddText(fs, "This is some more text,");
AddText(fs, "\r\nand this is on a new line");
AddText(fs, "\r\n\r\nThe following is a subset of characters:\r\n");
for (int i=1;i < 120;i++)
{
AddText(fs, Convert.ToChar(i).ToString());
}
}
Объяснение:
Обеспечивает удобный синтаксис, который обеспечивает правильное использование объектов IDisposable.
Оператор using вызывает метод Dispose для объекта в блоке и блоке.
Он вызывается методом Dispose, даже если выбрано исключение.
local-variable-declaration
не expression
Другой пример expression
о котором я не упоминал, здесь:
IDisposable disposable;
using (disposable = new SomeDisposableObject()) {
// do something
}
или
IDisposable disposable;
using (disposable = SomeExpressionOrFunctionThatEvaluatesToADisposable()) {
// do something
}
Ссылка не должна быть типа IDisposable
, она может быть любым типом, который ее реализует.
Главное, на что нужно обратить внимание, это на самом деле определение объявления local-variable-declaration
из раздела 8.5.1
Объявление local-variable объявляет одну или несколько локальных переменных. локальная переменная декларация:
Локальные переменные-деклараторы local-variable-type локальный переменный тип:
тип
вар локальные-значения_переменные declarators:
локальный переменный описатель
local-variable-declarators, local-variable-declarator локальный переменный описатель:
идентификатор
Идентификатор = локальная переменная-инициализатор локальный переменный инициализатор:
выражение
массив инициализатор
Таким образом, объявление local-variable-declaration
может быть выражено как type identifer = expression
. Итак, что говорит вам спецификация using
, вы можете либо объявить переменную в форме var variableName = xxxxxxx
либо вы можете просто использовать часть xxxxxx
самостоятельно.
var res = GetResource(); using (res) { ... }
Этот стиль не рекомендуется, так какres
все еще находится в области действия после блокаusing
, но был удален.