Khuôn khổ Microsoft.NET cung cấp giao diện IDisposable
yêu cầu triển khai phương thức void Dispose()
. Mục đích của nó là để cho phép hướng dẫn sử dụng, hoặc phạm vi dựa trên phát hành các nguồn lực đắt tiền thực hiện IDisposable
có thể đã được phân bổ. Ví dụ bao gồm bộ sưu tập cơ sở dữ liệu, luồng và xử lý.Việc triển khai IDisposable.Dispose() có nên là idempotent không?
Câu hỏi của tôi là, việc triển khai phương pháp Dispose()
là không đáng tin cậy - khi được gọi nhiều lần trong cùng một trường hợp, cá thể được 'xử lý' chỉ một lần và các cuộc gọi tiếp theo không phải để ném ngoại lệ. Trong Java, hầu hết các đối tượng có hành vi tương tự (một lần nữa các luồng và kết nối cơ sở dữ liệu đến với tâm trí của tôi làm ví dụ) là không cần thiết cho hoạt động close()
của chúng, tương tự như phương thức Dispose()
.
Tuy nhiên, kinh nghiệm cá nhân của tôi với NET (và Windows Forms nói riêng), cho thấy rằng không phải tất cả hiện thực (nghĩa là một phần của .NET framework) là idempotent, do đó cuộc gọi tiếp theo đối với các ném một ObjectDisposedException
. Điều này thực sự gây nhầm lẫn cho tôi về cách thực hiện một đối tượng dùng một lần nên được tiếp cận. Có một câu trả lời chung cho kịch bản, hoặc là nó phụ thuộc vào bối cảnh cụ thể của đối tượng và cách sử dụng của nó?
Chỉ vì Microsoft không luôn tuân theo đề xuất của riêng họ không có nghĩa là bạn nên làm như vậy. – linkerro
@linkerro - Bạn có thể mở rộng nhận xét khá khó hiểu của mình không? – Oded
Tôi tự hỏi nếu anh ta đề cập đến WinForms ném một ngoại lệ nếu bạn Vứt bỏ một điều khiển hai lần. – DaveShaw