2010-03-01 26 views
15

Có cần thiết phải đóng luồng hay không, bởi vì .net là mã được quản lý, nó sẽ tự động bị đóng ngay khi nó rơi ra khỏi phạm vi (giả sử không có ngoại lệ nào được nêu ra).Đóng luồng, luôn cần thiết? .net

Illustrated:

static string SerialiseObjectToBase64(object obj) 
{ 
    var mstream = new MemoryStream(); 
    ... 
    return Convert.ToBase64String(mstream.ToArray());   
} 

Là mã trên có thể chấp nhận?

Trả lời

12

Với MemoryStream nó là một chút của một điểm tranh luận - kể từ khi bạn đang rốt cuộc nói chuyện với một quản lý byte[] (vì vậy nó vẫn sẽ chờ thu gom rác thải thông thường). Nhưng trong chung, có: bạn nên đóng (tốt hơn: Dispose() qua using, vì vậy nó sẽ bị tắt khi ngoại lệ) luồng khi hoàn tất, nếu không bạn có thể không xóa một số dữ liệu đến đích (không được quản lý) cơ bản. Và có một số luồng không thực sự hoàn toàn "tuôn ra" trên Flush() - chúng cầnClose() d (các luồng nén cụ thể).

9

Thực tiễn tốt là đóng luồng của bạn. Sử dụng câu lệnh usingDispose() sẽ được gọi khi nó nằm ngoài phạm vi (hoặc nếu ngoại lệ được ném), điều này sẽ đóng lại luồng của bạn.

static string SerialiseObjectToBase64(object obj) 
{ 
    using (var mstream = new MemoryStream()) 
    { 
     ... 
     return Convert.ToBase64String(mstream.ToArray()); 
    } 
} 
+1

@Greg - Nó chắc chắn sẽ được đóng tự động khi trình finalizer được chạy. Tuy nhiên không có bảo đảm KHI nó sẽ được đóng lại (có thể chỉ là khi quá trình thoát) - vì vậy khi bạn chỉ ra bằng cách sử dụng 'sử dụng' luôn luôn là một ý tưởng tốt. – Aaron

+0

@Aaron - Cảm ơn, tôi đã cập nhật câu trả lời của mình. – Greg

3

GC của .Net rất ... lười biếng. Chỉ vì một tài liệu tham khảo đã bị mất không có nghĩa là nó ngay lập tức bị cuốn lên, nghiền nát và gửi đến bãi rác. Nó luôn luôn là một ý tưởng tốt để đóng tài nguyên mở và xử lý các đối tượng thực hiện IDisposable cho chính lý do đó.

4

Luồng đóng và xử lý đối tượng là 2 thứ khác nhau. Việc đóng luồng sẽ xóa bộ đệm ghi và ghi bất kỳ dữ liệu không được ghi nào vào luồng. Việc loại bỏ luồng sẽ giải phóng bộ nhớ được sử dụng bởi biến luồng.

+3

Điều này không đúng. Xử lý một luồng * sẽ * đóng và xóa nó ... nhưng nó sẽ không * giải phóng bất kỳ bộ nhớ nào. –

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