выражения в C # с помощью оператора

1

Справочное руководство по С# определяет синтаксис использования операторов как:

using-statement:
   using   (    resource-acquisition   )    embedded-statement

resource-acquisition:
   local-variable-declaration
   expression

Может ли кто-нибудь предоставить мне пример, который использует выражение внутри оператора using. В обычных примерах используется объявление переменной.

  • 4
    var res = GetResource(); using (res) { ... } Этот стиль не рекомендуется, так как res все еще находится в области действия после блока using , но был удален.
  • 0
    Итак, только идентификатор? Для меня грамматика выглядит очень разрешающей, и на синтаксическом уровне все выражения допускаются.
Показать ещё 3 комментария
Теги:
expression
using-statement

4 ответа

3

Пример использования выражения следующий:

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");
}
1

Пример:

//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, даже если выбрано исключение.

  • 1
    это пример объявления local-variable-declaration не expression
0

Другой пример expression о котором я не упоминал, здесь:

IDisposable disposable;
using (disposable = new SomeDisposableObject()) {
   // do something
}

или

IDisposable disposable;
using (disposable = SomeExpressionOrFunctionThatEvaluatesToADisposable()) {
   // do something
}

Ссылка не должна быть типа IDisposable, она может быть любым типом, который ее реализует.

0

Главное, на что нужно обратить внимание, это на самом деле определение объявления 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 самостоятельно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню