2012-12-27 11 views
7

Khi bạn gọi Close trên StreamWriter hoạt động, nó không thể viết thêm bất kỳ mã nào vào luồng (vì nó đã bị đóng). Để mở một luồng khác, bạn phải tạo một phiên bản mới của StreamWriter vì không có phương thức 'Mở'.Điểm của các nhà soạn nhạc có Close() và Dispose() là gì?

Câu hỏi của tôi là, có điểm gì trong việc có CloseDispose khi bạn không thể sử dụng bất kỳ thứ gì ngoài Dispose sau khi đóng luồng?

Tôi có thể hiểu nếu có chức năng Open, tức là bạn có thể đóng một tệp rồi mở một tệp khác bằng cùng một số StreamWriter. Nhưng vì chỉ có Close và bạn không thể sử dụng bất cứ thứ gì ngoài Dispose sau đó, tại sao không chỉ loại bỏ Close và có Dispose đóng luồng cơ bản là hành động đầu tiên của nó?

Tôi nhận được rằng Dispose đến từ IDisposeable và tất cả những điều đó. Những gì tôi muốn biết là lý do tại sao Close là cần thiết cụ thể khi Dispose xuất hiện để gọi Close.

Theo như tôi thấy, không có khả năng để mở dòng khác với cùng StreamWriter, không có điểm trong có Close khi bạn không có lựa chọn nào khác để Dispose sau đó vì tất cả các phương pháp khác trở nên vô dụng.

Tại sao là StreamWriter những người đang gặp phải Close khi họ có thể hợp nhất CloseDispose vào một phương pháp đơn lẻ?

+1

Dường như bạn có nó ngược - 'Close' gọi' Vứt bỏ', không phải theo cách khác. –

+1

'Đóng' các cuộc gọi' Vứt bỏ', đóng tài nguyên luồng cơ bản. –

Trả lời

2

Khi xử lý luồng có quy ước lâu dài, Close là phương pháp mà chúng phải đóng luồng. Đó là thuật ngữ mà nhiều lập trình viên được sử dụng và mong đợi để xem khi giao dịch với luồng. Nó sẽ có khả năng gây nhầm lẫn để có một luồng mà không có phương pháp Close và có thể mất chút thời gian để mọi người nhận ra rằng họ nên sử dụng Dispose để đóng luồng.

Đó chắc chắn thể cho lớp đã thực hiện IDisposable một cách rõ ràng, do đó phương pháp Dispose sẽ không có mặt ở đó mà không có một dàn diễn viên để IDisposable, và rằng tôi đã làm sạch lên một số sự nhầm lẫn, nhưng họ chọn không làm điều đó và để lại hai phương thức trùng lặp trong lớp.

Hoàn toàn tùy thuộc vào sở thích cá nhân của bạn cho dù bạn sử dụng Dispose hoặc Close để đóng luồng.

+1

Tôi đã đọc nhiều lần này, việc đóng này là một phần của luồng và trình đọc/viết đơn giản chỉ vì quy ước "đóng" một tệp. Tôi không thể nhớ, nhưng tôi cảm thấy rằng thông tin đó được nêu trong CLR thông qua C#. –

+2

'Close' thực sự chỉ là một dấu vết còn lại được đặt tên thân thiện từ .NET 1.0, trước khi chúng có các quy ước của chúng.Microsoft đã nói rằng 'Dispose' nên được ưu tiên cho sự nhất quán trên các API khác nhau, và đã không viết một phương thức' Close' trùng lặp tính năng kể từ đó. –

+0

Quay lại một số câu hỏi trước đây của tôi mà không có câu trả lời. Tôi đã chọn cái này vì tất cả các câu trả lời khác dường như đang giải quyết sự trộn lẫn giữa việc 'Close' gọi' Dispose' hay cách khác thay vì câu hỏi thực của tôi về "Tại sao StreamWriter lại có Close khi họ có thể hợp nhất Đóng và Vứt bỏ thành một phương pháp duy nhất? ". Tôi không biết chắc chắn nếu đây là * câu trả lời đúng, nhưng chắc chắn là * chính xác nhất * trong số các câu trả lời được trình bày. – Pharap

1

Theo số the documentation, Close chỉ cần gọi Dispose với giá trị true.

  • Phương pháp này sẽ ghi đè Đóng.

  • Việc triển khai Đóng cuộc gọi Phương thức hủy bỏ chuyển giá trị thực.

  • Bạn phải gọi Đóng để đảm bảo rằng tất cả dữ liệu được ghi chính xác vào luồng cơ bản. Sau cuộc gọi đến Đóng, mọi hoạt động trên StreamWriter có thể tăng ngoại lệ. Nếu không có đủ dung lượng trên đĩa, hãy gọi Đóng sẽ tăng ngoại lệ.

Dispose tự nó được thừa hưởng từ IDisposable, được sử dụng bởi các lớp học có nguồn lực mà cần phải được giải phóng.

0

Mở luồng phân bổ cả tài nguyên ứng dụng và hệ thống. Nếu ứng dụng của bạn mở nhiều luồng mà không đóng chúng, thì nó sẽ hạn chế khả năng của các ứng dụng khác truy cập các tệp đó. Điều quan trọng là các luồng được đóng càng sớm càng tốt.

Theo như lý do tại sao luồng không có khả năng mở lại, điều này về cơ bản là phương pháp .NET. Lớp này đại diện cho một luồng mở. Vì vậy, hãy tạo một tài khoản để truy cập luồng và loại bỏ nó càng sớm càng tốt. Khi bạn muốn truy cập lại vào luồng, bạn tạo một luồng khác.

Tôi nghĩ rằng nó sẽ hợp lệ để tạo một lớp dòng có thể được mở lại, nhưng nó gây ra một số vấn đề vì nhiều phương pháp sẽ không hoạt động khi luồng được đóng lại. Cuối cùng, một lớp luồng thực sự đại diện cho một luồng mở.

Dispose chỉ có ở đó để đảm bảo luồng được làm sạch kịp thời dễ dàng hơn.

-1

Bạn đang đi đúng hướng khi bạn nói "tại sao không chỉ loại bỏ ..." ngoại trừ nó ngược lại. Nếu bạn nhìn vào các mã cơ bản cho StreamWriter.Close() bạn sẽ thấy:

public override void Close() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize((object) this); 
} 

Vì vậy,() phương thức Close chỉ là cách bạn sẽ nói với khuôn khổ mà bạn đang thực hiện bằng văn bản cho dòng.

0

lý do tại sao không chỉ loại bỏ gần và đã bỏ gần dòng cơ bản như hành động đầu tiên của nó?

Thực hành lập trình tốt.

Giả sử bạn có đèn trong ngôi nhà tự động tắt khi bạn rời khỏi. Bạn sẽ không để tắt đèn khi bạn rời đi, nhưng nó tốt thực hành. Bằng cách đó, bạn sẽ không yêu cầu mọi ngôi nhà bạn sống tự động tắt đèn. Bạn sẽ có thói quen tự tắt chúng.

Gọi rõ ràng Close() thông báo cho người đọc (và hệ thống) "Tôi đã thực hiện với luồng này" và gọi Dispose() thông báo cho hệ thống (và người đọc) "bạn có thể giải phóng mọi tài nguyên được nhúng".

+2

Không cần phải gọi cả hai phương pháp. 'Close' chỉ gọi' Dispose'. Gọi cả hai chỉ là dư thừa, và không có nghĩa là một thực hành tốt. – Servy