2010-08-10 13 views
7

Naprawdę przeszkadza mi konieczność umieszczania bloków using w języku C#. To nie jest eleganckie i zajmuje dużo miejsca. W niektórych przypadkach wydaje się to nieuniknione, ponieważ muszę zadeklarować zmienne różnych typów danych, ale wydaje się, że uproszczenie powinno być możliwe w przypadku pojedynczego typu. Co mam na myśli przez "przypadek jednego typu", to gdy kilka zmiennych tego samego typu jest zadeklarowanych szeregowo. Oto przykład tego, co mówię:Złomowanie w C# przy użyciu bloków

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

Sposób chcę to do pracy jest to, że a jest zbudowany przed b, a b jest umieszczony przed a. Niestety nie wydaje się, aby w specyfikacji C# był jakikolwiek kierunek, w jaki sposób powinien się on faktycznie odbywać. Wydaje się, że kompilator C# Microsoft traktuje go tak, jak to jest wyjście działa powyższy program:

Creating a 
Creating b 
Disposing b 
Disposing a 

Jednak nie mam możliwości zapewnienia, że ​​jest to zachowanie deterministyczne. Czy ktoś może potwierdzić lub odrzucić pomysł, że ta sekwencja jest deterministyczna? Referencje byłyby świetne. I oczywiście, jeśli jest podatny na złamanie (nieudokumentowane itp.), Prawdopodobnie nie jest to użyteczne, ale dobrze o tym wiedzieć.

Istnieje już podobne pytanie dotyczące deterministic disposal, które mówi o przypadku wielu typów i rozumiem, że nie ma tu prawdziwego rozwiązania poza sprytnymi sztuczkami składni. Większość odpowiedzi tam jednak nie trafia. Moje pytanie dotyczy tylko przypadku jednego typu i czy to zbycie jest deterministyczne i niezawodne, czy nie. Dzięki.

+0

Alternatywa jest brzydsza IMHO –

Odpowiedz

18

Z C# spec:

"A using zestawienia postaci using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) jest właśnie odpowiednikiem sekwencji zagnieżdżonych using oświadczenia:"

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

Dlatego wydaje się sprawiedliwe, że jest to całkiem niezrozumiałe.

+0

Fajnie, dokładnie to musiałem wiedzieć. Z której to sekcji? A jaka wersja specyfikacji? Zrobiłem przeszukiwanie pełnego tekstu specyfikacji C# 4.0 i nadal go przegapiłem. –

+1

Połączyłem się dokładnie z sekcją: X http://msdn.microsoft.com/en-us/library/aa664736(v=VS.71).aspx – mquander

9

Czy jest jakikolwiek powód, dla którego nie można użyć sztuczki wielokrotnego użytku? To jest całkowicie deterministyczny, i rozwiązuje problem

using (A a = new A("a")) 
using (A b = new A("b")) { 
    // .... 
} 
+0

Nie lubię używać tej składni z tego samego powodu, dla którego nie lubię używać instrukcji "if" bez nawiasów klamrowych. Działa i używam go, ale zawsze obawiam się, że go zepsuje podczas przyszłych konserwacji. W przypadku typów danych mieszanych jest to jedyna opcja, ale dobrze byłoby mieć czystszą deterministyczną składnię. –