Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Khác biệt giữa Dispose() và Finalize() trong C#

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ải java.lang.Object như 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 Dispose khô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 Dispose do 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ểmDisposeFinalize
Gọi bởiNgười dùng (hoặc using)Garbage Collector
Thời điểmXác định (deterministic)Không xác định (non-deterministic)
Hiệu suấtCaoThấp hơn
Triển khaiInterface IDisposableOverride 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.