Bạn nên làm theo mô hình truyền thống để thực hiện Dispose
. Làm cho Dispose()
ảo được coi là thực hành không tốt, vì mô hình thông thường nhấn mạnh việc sử dụng lại mã trong "dọn dẹp được quản lý" (API client gọi Dispose()
trực tiếp hoặc qua using
) và "dọn dẹp không được quản lý" (trình kết thúc cuộc gọi GC). Để nhắc nhở, mô hình là thế này:
public class Base
{
~Base()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // so that Dispose(false) isn't called later
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose all owned managed objects
}
// Release unmanaged resources
}
}
chính ở đây là không có sự trùng lặp giữa finalizer và Dispose
cho dọn dẹp không được quản lý, tuy nhiên bất kỳ lớp được thừa kế có thể kéo dài cả dọn dẹp và quản lý không được quản lý.
Đối với trường hợp của bạn, những gì bạn nên làm là thế này:
protected abstract void Dispose(bool disposing)
và để lại mọi thứ khác như vậy. Thậm chí đó là giá trị đáng ngờ, vì bạn đang thực thi các lớp dẫn xuất của mình để thực hiện Dispose
ngay bây giờ - và làm thế nào để bạn biết rằng tất cả chúng đều cần nó? Nếu lớp cơ sở của bạn không có gì để vứt bỏ, nhưng hầu hết các lớp dẫn xuất có thể làm (với một vài ngoại lệ, có lẽ), thì chỉ cần cung cấp một thực hiện rỗng. Đó là những gì System.IO.Stream
(bản thân nó trừu tượng), do đó, có tiền lệ.
Nguồn
2009-11-09 20:54:13
Tại sao bạn cần thêm Dispose() vào giao diện của mình? Nếu nó được kế thừa từ IDisposable thì phương thức Dispose() đã là một phần của giao diện của bạn. –
Seth, bạn phải thực hiện tất cả các thành viên giao diện. Bỏ nó ra sẽ không biên dịch. –