Меня очень беспокоит необходимость вложения using
блоков в С#. Это не элегантно и занимает много места. В некоторых случаях это кажется неизбежным, потому что мне нужно объявить переменные разных типов данных, но кажется, что случай с одним типом можно упростить. Под «однотипным случаем» я подразумеваю, когда несколько переменных одного типа объявляются последовательно. Вот пример того, о чем я говорю:
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# нет никаких указаний относительно того, как это должно происходить на самом деле. Похоже, что компилятор Microsoft C# обрабатывает это так, поскольку это результат запуска вышеуказанной программы:
Creating a
Creating b
Disposing b
Disposing a
Однако у меня нет способа гарантировать, что это детерминированное поведение. Может ли кто-нибудь подтвердить или опровергнуть идею о детерминированности этой последовательности? Ссылки было бы здорово. И, очевидно, если он склонен к поломке (незадокументированный и т. д.), он, вероятно, бесполезен, но это полезно знать.
Уже есть аналогичный вопрос о детерминированном удалении, в котором говорится о случае с несколькими типами, и я понимаю, что здесь нет реального решения, кроме хитрых синтаксических трюков. В любом случае, большинство ответов там упускают суть. Мой вопрос касается случая с одним типом и того, является ли это удаление детерминированным и надежным или нет. Спасибо.