2009-06-02 11 views
5

Điều này có vẻ giống như một câu hỏi gật đầu, nhưng tôi đã nhìn vào điều này vì tôi nghe ai đó tuyên bố rằng bạn phải gọi Close() trên FileStream, ngay cả khi nó đang sử dụng khối (và họ có mã nơi Close() đang được gọi ngay tại cuối khối).Làm thế nào là IDisposable được thực hiện trên FileStream trong .Net 1.1

Tôi biết rằng Close() có nghĩa là gọi Dispose(), nhưng tôi nghĩ rằng tôi sẽ xem xét sâu hơn vì đây là mã .Net 1.1 và phần lớn trải nghiệm của tôi đã được bật 2.0.

Một điều khiến tôi thấy là tài liệu MSDN cho FileStream có Dispose() và Dispose (bool) cho .Net 2.0 trên, nhưng chỉ Dispose (bool) cho .Net 1.1.

Tôi nghĩ rằng có thể là một sự giám sát, vì vậy tôi đã sử dụng Reflector để xem xét một assembly - và ở đó, tôi thấy Dispose (bool), nhưng không Dispose().

Điều này có đúng không? Nếu vậy, câu chuyện ở đây là gì? FileStream làm việc trong một khối sử dụng - mà tôi nghĩ có nghĩa là nó phải thực hiện IDisposable mà, để kiến ​​thức của tôi chỉ tuyên bố Dispose().

Có một số trình biên dịch kỳ diệu xảy ra, hay tôi thiếu một cài đặt ẩn của Dispose() ở đâu đó (trong đó, có lẽ, gọi Dispose (true) hoặc Dispose (false)?)

Cuối cùng (không có ý định chơi chữ), bạn có thể xác nhận rằng phạm vi một FileStream trong việc sử dụng khối sẽ đóng dòng tại phạm vi thoát trong .Net 1.1?

[sửa]

Chỉ cần làm rõ, đây là mã C#. Tôi hiểu rằng VB.Net đã không nhận được báo cáo sử dụng cho đến khi .Net 2.0, nhưng sự hiểu biết của tôi là C# đã có nó trong 1.1 (và mã 1.1 của tôi ở đây có nó và biên dịch)

+0

Nó là tài liệu cho Net 1.1 ở đây: http://msdn.microsoft.com/en-us/library/yh598w02(VS.71).aspx. Ngoài ra, tôi có mã ở phía trước của tôi trong VS2003, nhắm mục tiêu .Net 1.1, trong đó sử dụng các khối. – philsquared

+0

phải là VB.NET đã nhận nó trong 2.0 sau đó .... –

+0

... đó là, C# nhắm mục tiêu .Net 1.1 - sử dụng là một tính năng ngôn ngữ, AFAIK, requries không có hỗ trợ bổ sung từ thời gian chạy. Tôi biết rằng VB.Net đã không nhận được nó cho đến khi .Net 2.0 – philsquared

Trả lời

9

Nó thực hiện một chút buồn cười , nhưng nó ở đó: Lớp cơ sở cho FileStream: System.IO.Stream thực hiện IDisposable (FileStream chỉ kế thừa nó).

Lớp luồng cơ sở thực hiện Vứt bỏ() một cách rõ ràng, vì vậy bạn sẽ chỉ thấy Vứt bỏ() nếu bạn truyền luồng dưới dạng có thể định dạng được (có thể sử dụng được).

Stream.Dispose() gọi Stream.Close().

(có tất cả điều này qua Reflector)

+0

Cảm ơn, JMarsch. Tất cả đều có ý nghĩa. Bạn có phải làm bất cứ điều gì đặc biệt để xem nó trong Reflector không? Tôi không thể nhìn thấy nó trong dòng hoặc (sẽ kiểm tra lại vào ngày mai) – philsquared

+1

Tôi đã gặp khó khăn trong việc tìm kiếm nó quá - Tôi đã khá bối rối lúc đầu tiên! Bí quyết là nó được thực hiện một cách rõ ràng, và tôi đoán điều đó có nghĩa là nó không phân loại như bạn mong đợi. Trong dòng, hãy tìm "System.IDisposable.Dispose()" Nó được sắp xếp với "s", và trên hết, nó có màu xám, nhưng nó ở đó. Trân trọng – JMarsch