Phương thức Dispose
- Được định nghĩa trong interface
IDisposable. - Phải được gọi rõ ràng bởi người dùng (hoặc qua khối
using). - Giải phóng tài nguyên không được quản lý (unmanaged resources) ngay lập tức khi được gọi.
- Có thể triển khai khi có phương thức
Close(). - Được khai báo là
public. - Thực thi nhanh chóng, giải phóng đối tượng tức thì.
- Do giải phóng tức thời, không ảnh hưởng đến hiệu suất ứng dụng.
Phương thức Finalize
- Là phương thức hủy (destructor) được định nghĩa trong lớp
System.Object(không phảijava.lang.Objectnhư ghi nhầm trong bài gốc). - Được gọi tự động bởi Garbage Collector (GC) khi đối tượng bị thu gom rác.
- Giải phóng tài nguyên không được quản lý ngay trước khi đối tượng bị hủy.
- Được triển khai để dọn dẹp tài nguyên không được quản lý khi
Disposekhông được gọi. - Được khai báo là
protected(trong C# viết dưới dạng~ClassName()). - Chậm hơn so với
Disposedo cơ chế finalization queue của GC. - Có thể ảnh hưởng hiệu suất nếu lạm dụng, vì đối tượng cần thêm vòng GC để dọn dẹp.
Tóm tắt so sánh
| Đặc điểm | Dispose | Finalize |
|---|---|---|
| Gọi bởi | Người dùng (hoặc using) | Garbage Collector |
| Thời điểm | Xác định (deterministic) | Không xác định (non-deterministic) |
| Hiệu suất | Cao | Thấp hơn |
| Triển khai | Interface IDisposable | Override Finalize (destructor) |
Lời khuyên: Luôn ưu tiên triển khai IDisposable và sử dụng khối using để đảm bảo giải phóng tài nguyên kịp thời. Chỉ triển khai finalizer khi lớp trực tiếp nắm giữ tài nguyên unmanaged.