Меня действительно беспокоит необходимость вкладывать с использованием блоков
в 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
Однако у меня нет никакого способа убедиться, что это детерминированное поведение. Может ли кто-либо подтвердить или опровергнуть идею о том, что эта последовательность является детерминированной? Ссылки были бы отличными. И, разумеется, если он подвержен поломке (недокументированный и т. Д.), Он, вероятно, бесполезен, но это полезно знать.
Уже есть похожий вопрос о детерминированном удалении , в котором говорится о случае с несколькими типами, и я понимаю, что там нет реального решения, кроме хитрых синтаксических приемов. Во всяком случае, большинство ответов там пропущено. Мой вопрос касается только случая одного типа и того, является ли это удаление детерминированным и надежным или нет. Спасибо.
Из спецификации C #:
"A using
оператор формы using (ResourceType r1 = e1, r2 = e2, ..., rN = eN)
в точности эквивалентен последовательности вложенных с использованием
операторов: «
using (ResourceType r1 = e1)
using (ResourceType r2 = e2)
...
using (ResourceType rN = eN)
statement
Таким образом, кажется справедливым сказать, что это совершенно высечено в камне.
Есть ли причина, по которой вы не можете использовать трюк с многократным использованием? Это полностью детерминировано и решает вашу проблему
using (A a = new A("a"))
using (A b = new A("b")) {
// ....
}