2012-02-22 30 views
224

Có thể làm cho mã này nhỏ gọn hơn bằng cách nào đó khai báo 2 biến trong cùng một khối sử dụng không?sử dụng câu lệnh với nhiều biến số

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

Đừng sử dụng 'XmlTextReader mới()'. Sử dụng 'XmlReader.Create()' –

+1

@JohnSaunders tại sao? –

+10

'new XmlTextReader()' đã không còn được dùng kể từ .NET 2.0. Bằng cách sử dụng 'XmlReader.Create()', bạn sẽ nhận được lớp 'XmlReader' có nguồn gốc tốt nhất, trái ngược với chỉ một lớp' XmlTextReader'. –

Trả lời

417

Cách chấp nhận là chỉ để chuỗi các báo cáo:

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

Lưu ý rằng IDE cũng sẽ hỗ trợ thụt đầu dòng này, tức là nó cố tình sẽ không cố gắng để thụt các using tuyên bố thứ hai.

+0

Điều này có sử dụng quy tắc một-lót-không-niềng răng để phạm vi các câu lệnh trong nhau hay thực sự biên dịch thành một số loại chuỗi không? – ssube

+0

@peachykeen Nó là một khối lồng nhau nhưng tôi nghĩ rằng trong trường hợp này điều này là không thể phân biệt từ một chuỗi do ngữ nghĩa của 'sử dụng' anyway. Hoặc nếu không, tôi không hiểu ý của bạn bằng chuỗi: lưu ý rằng để 'sử dụng' hoạt động đúng, mỗi tài nguyên yêu cầu khối' try'… 'finally' của riêng nó. –

+0

Tôi thấy không có sự khác biệt giữa mã này và mã trong câu hỏi. –

96

Chỉ áp dụng cho các trường hợp cùng loại! Cảm ơn các ý kiến.

mẫu mã này là từ MSDN:

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

Điều này chỉ hoạt động khi các biến có cùng loại. –

+1

chỉ có vẻ hoạt động nếu cả hai đối tượng cùng loại –

+3

Sau đó khai báo các biến là IDisposable và cast sau này? –

Các vấn đề liên quan