631
Chương 16: Các giao diện và mẫu thông dụng
// resourceHandle = ...
}
// Destructor/Finalizer.
~DisposeExample() {
// Gọi phiên bản nạp chồng protected của Dispose
// và truyền giá trị "false" để cho biết rằng
// Dispose đang được gọi trong quá trình thu gom rác,
// chứ không phải bởi mã consumer.
Dispose(false);
}
// Hiện thực public của phương thức IDisposable.Dispose, được gọi
// bởi consumer của đối tượng để giải phóng các tài nguyên không-
// được-quản-lý một cách tất định.
public void Dispose() {
// Gọi phiên bản nạp chồng protected của Dispose và truyền
// giá trị "true" để cho biết rằng Dispose đang được gọi
// bởi mã consumer, chứ không phải bởi bộ thu gom rác.
Dispose(true);
// Vì phương thức Dispose thực hiện tất cả việc dọn dẹp cần
// thiết nên bảo đảm bộ thu gom rác không gọi destructor của lớp.
GC.SuppressFinalize(this);
}
// Phiên bản nạp chồng protected của phương thức Dispose. Đối số
// disposing cho biết phương thức được gọi bởi mã consumer (true),
// hay bởi bộ thu gom rác (false).
protected virtual void Dispose(bool disposing) {
if (!isDisposed) {
if (disposing) {
// Phương thức này được gọi bởi mã consumer. Gọi