2010-03-09 32 views
8

Thường thì tôi đang làm một cái gì đó như thế (chỉ là một ví dụ):C# Sử dụng theo từ khoá lồng trong dòng

using (Stream xmlStream = client.OpenRead(xmlUrl)) 
{ 
    using (XmlTextReader xmlReader = new XmlTextReader(xmlStream)) 
    { 
    } 
} 

Không phải là tốt hơn để làm:

using (XmlTextReader xmlReader = new XmlTextReader(client.OpenRead(xmlUrl))) 
{ 
} 

Nhưng tôi không chắc chắn nếu trong cú pháp ngắn này tất cả các tài nguyên sẽ được xử lý (Stream) hoặc chỉ XmlTextReader?

Cảm ơn trước vì câu trả lời của bạn.

+0

Tôi thực sự thích hình thức xóa đầu tiên - với dấu ngoặc vuông. Nó được xử lý đúng cách và là IMHO duy trì được nhiều nhất. –

Trả lời

20

Không; sẽ không đảm bảo rằng Stream được xử lý nếu nhà xây dựng XmlTextReader ném một ngoại lệ. Nhưng bạn có thể làm:

using (Stream xmlStream = client.OpenRead(xmlUrl)) 
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream)) 
{ 
    // use xmlReader 
} 
+1

Câu đầu tiên là tuyệt vời (1 cho rằng) nhưng phần còn lại, không phải là điều này (và TomTom) chỉ cú pháp đường? Nó thực sự giống với mã ban đầu phải không? – Lazarus

+0

@Lazarus - nó cũng giống như vậy, nhưng (quan trọng) nó dừng việc làm tổ khỏi việc đẩy mã ra phía bên tay phải của màn hình ;-p Trong tất cả sự nghiêm túc, chúng tôi đang đóng gói một đơn vị ở đây, vì vậy một cấp độ duy nhất của * trực quan * làm tổ dường như mong muốn. –

+0

Tôi đã không nhận ra rằng điều này sẽ ngăn chặn thụt lề, nó hoạt động khác với một câu lệnh if mà indents ngay cả khi bạn bỏ qua các dấu ngoặc đơn cho các khối dòng đơn. Tôi đã học được điều gì đó ... đó là một ngày tốt lành;) – Lazarus

2

gì về (tôi sử dụng bây giờ điều này):

using (Stream xmlStream = client.OpenRead(xmlUrl)) 
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream)) 
{ 
... 
} 

Việc sử dụng thứ hai là tham chiếu sử dụng từ đầu tiên - không cần phải có dấu ngoặc đơn.

2

Tham chiếu documentation cho biết đối tượng cần xử lý phải được khai báo trong tuyên bố sử dụng. Vì không có khai báo cho luồng, phương thức Vứt bỏ sẽ không được gọi.

Trong trường hợp của bạn, bạn có thể bỏ qua toàn bộ luồng và sử dụng hàm tạo cho TextReader lấy tham số url. Luồng cơ bản sẽ bị đóng khi người đọc được xử lý.

using (var xmlReader = new XmlTextReader(xmlUrl)) 
{ 
    ... 
} 
Các vấn đề liên quan