Cả hai đều để dọn tài nguyên, khác nhau ở thời điểm và ai gọi:
Finalize(viết dưới dạng destructor~T()): do GC gọi, không xác định thời điểm. Chỉ là lưới an toàn để giải phóng tài nguyên unmanaged nếu lập trình viên quên. Làm chậm GC → hạn chế dùng.Dispose(interfaceIDisposable): bạn gọi một cách xác định, ngay khi dùng xong (file, socket, DB connection).
using đảm bảo Dispose() luôn được gọi kể cả khi có exception:
csharp
using (var file = File.OpenText("a.txt"))
{
// ...
} // Dispose() gọi tự động ở đây
using var conn = new SqlConnection(cs); // cú pháp using declaration (C# 8+)Dispose pattern chuẩn: Dispose() giải phóng cả managed lẫn unmanaged rồi gọi GC.SuppressFinalize(this) để bỏ qua finalizer (vì đã dọn tay).
Chỉ viết finalizer khi class trực tiếp giữ tài nguyên unmanaged.