2012-02-22 15 views
224

Czy jest możliwe, aby ten kod był trochę bardziej kompaktowy, w jaki sposób deklarując 2 zmienną w tym samym bloku używając?za pomocą instrukcji z wieloma zmiennymi

using (var sr = new StringReader(content)) 
{ 
    using (var xtr = new XmlTextReader(sr)) 
    { 
     obj = XmlSerializer.Deserialize(xtr) as TModel; 
    } 
} 
+5

Nie używaj 'nową XmlTextReader()'. Użyj 'XmlReader.Create()' –

+1

@JohnSaunders dlaczego? –

+10

'nowy XmlTextReader()' został przestarzały od .NET 2.0. Używając 'XmlReader.Create()', uzyskasz najlepszą możliwą klasę 'XmlReader', w przeciwieństwie do jednej klasy' XmlTextReader'. –

Odpowiedz

417

Przyjęty sposób jest tylko do łańcucha oświadczenia:

using (var sr = new StringReader(content)) 
using (var xtr = new XmlTextReader(sr)) 
{ 
    obj = XmlSerializer.Deserialize(xtr) as TModel; 
} 

Zauważ, że IDE będzie również wspierać ten wcięcia, to znaczy, że celowo nie będzie próbował wciąć drugiego using oświadczenie.

+0

Czy to użyć reguły jeden-liner-no-szelki do zakresu sprawozdania wewnątrz siebie, czy rzeczywiście skompilować do jakiegoś łańcucha? – ssube

+0

@peachykeen Jest to zagnieżdżony blok, ale myślę, że w tym przypadku jest to nieodróżnialne od łańcucha ze względu na semantykę 'use'. Albo nie rozumiem co masz na myśli przez łańcuch: zauważ, że aby 'używać' działało poprawnie, każdy zasób wymaga własnego' try' ... 'finally' bloku. –

+0

Nie widzę różnicy między tym kodem a kodem int pytania. –

96

Poniższe działa tylko w przypadku wystąpienia tego samego typu! Dzięki za komentarze.

Ten przykładowy kod wynosi od MSDN:

using (Font font3 = new Font("Arial", 10.0f), font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 
+23

Działa to tylko wtedy, gdy zmienne są tego samego typu. –

+1

, które wydaje się działać tylko wtedy, gdy oba obiekty są tego samego typu. –

+3

Następnie zadeklarować zmienne jako IDisposable i odrzucić później? –

Powiązane problemy