2011-10-10 36 views
36

Tôi không chắc chắn liệu tôi cần phải gọi Flush() trên các đối tượng sử dụng nếu tôi viết một cái gì đó như thế này:Bạn có cần gọi Flush() trên luồng hoặc nhà văn nếu bạn đang sử dụng câu lệnh “sử dụng”?

using (FileStream...) 
using (CryptoStream...) 
using (BinaryWriter...) 
{ 
    // do something 
} 

Họ luôn tự động đỏ mặt? Khi nào câu hỏi using tuôn ra và khi nào thì không (nếu điều đó có thể xảy ra)?

Trả lời

42

Ngay khi bạn rời khỏi phạm vi của khối sử dụng, luồng được đóng và xử lý. Close() gọi Flush(), vì vậy bạn không cần phải gọi nó bằng tay.

+0

cuối của việc sử dụng các cuộc gọi gần? Tôi chỉ biết rằng nó phân phối luồng, và tôi gọi gần methode ở cuối mỗi lần. –

+9

Điều đó là không cần thiết, Vứt bỏ sẽ luôn Đóng luồng và Đóng sẽ tuôn ra luồng trước tiên. – nos

+1

@FelixCzylwik: nếu kết thúc sử dụng không gọi Close, bạn sẽ có tấn luồng mở và SQLConnections mở ra ở đó ...: D –

0

Thay đổi, Stream theo mặc định không gọi Flush() theo phương thức Dispose với một số ngoại lệ như FileStream. Lý do cho điều này là một số đối tượng dòng không cần gọi đến Flush vì chúng không sử dụng bộ đệm. Một số, chẳng hạn như MemoryStream ghi đè rõ ràng phương thức để đảm bảo rằng không có hành động nào được thực hiện (làm cho nó trở thành no-op).
Điều này có nghĩa là nếu bạn không muốn có thêm cuộc gọi trong đó thì bạn nên kiểm tra xem lớp con Stream bạn đang sử dụng thực hiện cuộc gọi theo phương thức Dispose và liệu nó có cần thiết hay không.

Bất kể, nó có thể là một ý tưởng tốt để gọi nó anyway chỉ để có thể đọc - tương tự như cách một số người gọi Close() ở phần cuối của báo cáo sử dụng của họ:

using (FileStream fS = new FileStream(params)) 
using (CryptoStream cS = new CryptoStream(params)) 
using (BinaryWriter bW = new BinaryWriter(params)) 
{ 
    doStuff(); 
    //from here it's just readability/assurance that things are properly flushed. 
    bW.Flush(); 
    bW.Close(); 
    cS.Flush(); 
    cS.Close(); 
    fS.Flush(); 
    fS.Close(); 
} 
+1

Tôi muốn tranh luận rằng việc thêm các cuộc gọi tuôn ra và đóng lại sẽ làm tổn hại đến khả năng đọc và bảo trì. Câu lệnh sử dụng là điều đảm bảo rằng đối tượng được xử lý đúng cách, ngay cả trong trường hợp ngoại lệ được ném ra. – Palec

+0

@Palec Tôi hiểu rằng vị trí, đây là một chút của một tiêu chuẩn phân chia giữa nhiều nhà phát triển từ những gì tôi đã thấy. – TheHitchenator

+0

@Palec Ngoài ra, như đã nói trong câu trả lời của tôi - theo mặc định, không gọi hàm 'Flush() 'trong phương thức vứt bỏ của chúng, nghĩa là nếu bạn đang sử dụng luồng không chuẩn được tạo bởi người chưa xem xét sử dụng câu lệnh sẽ không xóa bộ đệm đúng cách. Bởi vì điều này tôi muốn nói rằng đó là một thực hành tốt để tự tuôn ra - nó sẽ không làm bất cứ điều gì nếu nó không cần thiết nhưng nếu nó được thì nó sẽ đảm bảo bộ đệm đang được xử lý đúng cách. – TheHitchenator

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