2010-12-13 27 views
9

Giả sử tôi tạo ra một đóng cửa trên một nguồn tài nguyên như một StreamWriter:F #: Xử lý các tài nguyên bên trong một đóng cửa?

let currentdir = Directory.GetCurrentDirectory() 
let testfile = sprintf "%s\\%s" currentdir "closuretest.txt" 

let getwriter() = 
    let writer = new StreamWriter(testfile, false) 
    (fun() -> writer.Write "test") 

Có cách nào để đóng StreamWriter khi tôi đang thực hiện với việc đóng cửa? Hoặc tôi cần phải thay thế việc đóng cửa với một đối tượng bao bọc có một phương thức Write() và một phương thức Dispose()? (Đây tất nhiên là một ví dụ tầm thường.) Cảm ơn tất cả.

Trả lời

7

Có, bạn nên thay thế việc đóng bằng một đối tượng IDisposable bằng phương pháp và Dispose(). (Hoặc, trả lại một bộ đóng cửa, thứ hai trong số đó gọi Close() hoặc không, và để nó cho người gọi như thế.)

(Trong khi bạn đang ở đó, System.IO.Path.Combine() nên được sử dụng, thay vì dán các tên tập tin cùng nhau . với định dạng string)

+0

Cảm ơn bạn rất nhiều vì đã trả lời nhanh. Tài liệu F # có sẵn dường như nói về việc đóng cửa, và quản lý tài nguyên, nhưng không phải là cả hai cùng nhau. – FSharpN00b

3

đôi khi tôi làm:

let getwriter() = 
    let writer = new StreamWriter(testfile, false) 
    (fun() -> 
    use writer = writer 
    writer.Write "test") 
+0

Cảm ơn bạn rất nhiều vì đã trả lời Dr. Harrop. Điều đó có vẻ như nó giữ cho công việc mở tập tin ra khỏi đóng cửa, nhưng vẫn đóng tập tin như lối ra đóng cửa. Tôi sẽ sử dụng nó trong tương lai. – FSharpN00b

1

IDisposable khoảng deterministically, tài nguyên tức là phát hành một cách rõ ràng. Vì vậy, nếu việc đóng cửa không bằng cách nào đó cung cấp một chức năng xử lý của chính nó, thì tài nguyên đó không thể được giải phóng một cách xác định nữa.

Như Brian đã chỉ ra, điều này có thể ít nhiều rõ ràng, mặc dù việc triển khai IDisposable được ưu tiên hơn là use + IDisposable tự động quản lý tài nguyên trong trường hợp ngoại lệ.

Tuy nhiên, đôi khi nó đủ để ẩn hoàn toàn tài nguyên dùng một lần và nhận được đóng cửa những gì sẽ được thực hiện thay thế.

let getWriter body = 
    use writer = new StreamWriter(testfile, false) 
    body(writer) 

// ... 

getWriter (fun writer -> writer.Write "test") 
+0

Cảm ơn bạn rất nhiều vì đã trả lời Dario. Từ những gì tôi đã nghe, một đóng được biểu diễn như một đối tượng .NET khác. Tôi tự hỏi nếu vào một thời điểm nào đó, chúng tôi sẽ có cách để thêm hoàn thiện/vứt bỏ mã vào nó. – FSharpN00b

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