Порядок утилизации в C # с использованием блоков

Меня действительно беспокоит необходимость вкладывать с использованием блоков в C #. Это не элегантно и занимает много места. В некоторых случаях это кажется неизбежным, потому что мне нужно объявлять переменные разных типов данных, но похоже, что упрощенный случай должен быть упрощен. Под словом «случай одного типа» я подразумеваю, когда несколько переменных одного типа объявляются последовательно. Вот пример того, о чем я говорю:

class Program
{
    static void Main(string[] args)
    {
        using (A a = new A("a"), b = new A("b"))
        {
        }
    }

    class A : IDisposable
    {
        string n = null;
        public A(string name)
        {
            n = name;
            Console.WriteLine(String.Format("Creating {0}", n));
        }

        public void Dispose()
        {
            Console.WriteLine(String.Format("Disposing {0}", n));
        }
    }
}

Я хочу, чтобы это работало так: a создается до b , а b располагается до a . К сожалению, в спецификации C # нет никаких указаний относительно того, как это должно происходить на самом деле. Похоже, что компилятор C # от Microsoft воспринимает это так, поскольку это является результатом запуска вышеуказанной программы:

Creating a
Creating b
Disposing b
Disposing a

Однако у меня нет никакого способа убедиться, что это детерминированное поведение. Может ли кто-либо подтвердить или опровергнуть идею о том, что эта последовательность является детерминированной? Ссылки были бы отличными. И, разумеется, если он подвержен поломке (недокументированный и т. Д.), Он, вероятно, бесполезен, но это полезно знать.

Уже есть похожий вопрос о детерминированном удалении , в котором говорится о случае с несколькими типами, и я понимаю, что там нет реального решения, кроме хитрых синтаксических приемов. Во всяком случае, большинство ответов там пропущено. Мой вопрос касается только случая одного типа и того, является ли это удаление детерминированным и надежным или нет. Спасибо.

7
задан Community 23 May 2017 в 12:22
поделиться

2 ответа

Из спецификации C #:

"A using оператор формы using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) в точности эквивалентен последовательности вложенных с использованием операторов: «

using (ResourceType r1 = e1)
   using (ResourceType r2 = e2)
      ...
         using (ResourceType rN = eN)
            statement

Таким образом, кажется справедливым сказать, что это совершенно высечено в камне.

18
ответ дан 6 December 2019 в 06:35
поделиться

Есть ли причина, по которой вы не можете использовать трюк с многократным использованием? Это полностью детерминировано и решает вашу проблему

using (A a = new A("a"))
using (A b = new A("b")) {
    // ....
}
9
ответ дан 6 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: