29 IDisposable – using

Trong lập trình C#, việc quản lý tài nguyên không được quản lý bởi .NET, như tệp tin, kết nối mạng hoặc cơ sở dữ liệu, là rất quan trọng để đảm bảo hiệu suất và độ tin cậy của ứng dụng. Để hỗ trợ việc này, C# cung cấp giao diện IDisposable và từ khóa using.

1. Giao diện IDisposable

Giao diện IDisposable định nghĩa một phương thức duy nhất:

public interface IDisposable
{
    void Dispose();
}

Các lớp triển khai giao diện này cần cung cấp logic để giải phóng tài nguyên trong phương thức Dispose(). Điều này cho phép lập trình viên chủ động giải phóng tài nguyên khi đối tượng không còn cần thiết.

Ví dụ:

public class WriteData : IDisposable {

    // trường lưu trạng thái Dispose
    private bool m_Disposed = false;

    private StreamWriter stream;

    public WriteData (string filename) {
        stream = new StreamWriter (filename, true);
    }

    // Phương thức triển khai từ giao diện
    public void Dispose () {
        Dispose (true);
        GC.SuppressFinalize (this);
    }

    // Nếu disposing = true -> Được thi hành do gọi trực tiếp (do Dispose gọi)
    // tài nguyên managed, unmanaged được giải phóng
    // nếu disposing = fale -> Được thi hành bởi phương thức hủy, chỉ cần giải phóng
    // các toàn nguyên unmanaged.
    protected virtual void Dispose (bool disposing) {
        if (!m_Disposed) {
            if (disposing) {
                // các đối tượng có Dispose gọi ở đây
                stream.Dispose();
            }

            // giải phóng các tài nguyên không quản lý được cửa lớp (unmanaged)

            m_Disposed = true;
        }
    }

    ~WriteData () {
        Dispose(false);
    }

}

Đoạn mã trên triển khai giao diện IDisposable để quản lý tài nguyên trong lớp WriteData. Lớp này có trách nhiệm ghi dữ liệu vào một tệp tin thông qua đối tượng StreamWriter. Việc triển khai IDisposable đảm bảo rằng tài nguyên được quản lý (StreamWriter) và không quản lý (nếu có) sẽ được giải phóng đúng cách.

2. Từ khóa using

Từ khóa using cung cấp một cách thuận tiện để đảm bảo rằng các đối tượng triển khai IDisposable được giải phóng đúng cách. Khi khối lệnh using kết thúc, phương thức Dispose() của đối tượng sẽ được gọi tự động, ngay cả khi có ngoại lệ xảy ra.

Cú pháp:

using (WriteData writeData = new WriteData("filename.txt")) {
    // do something
}// Tại đây, writeData .Dispose() được gọi tự động

Ví dụ:

Nếu không dùng using, thì chủ động gọi Dispose, tài nguyên cũng giải phóng đúng yêu cầu.

WriteData writeData = new WriteData("filename.txt");
//do something
writeData.Dispose();

3. Lợi ích của việc sử dụng IDisposableusing

  • Quản lý tài nguyên hiệu quả: Đảm bảo rằng tài nguyên không được quản lý bởi .NET được giải phóng kịp thời, tránh rò rỉ bộ nhớ.
  • Mã nguồn rõ ràng: Sử dụng using giúp mã nguồn ngắn gọn và dễ hiểu hơn trong việc quản lý vòng đời của đối tượng.
  • Xử lý ngoại lệ an toàn: using đảm bảo Dispose() được gọi ngay cả khi có ngoại lệ, giúp ứng dụng ổn định hơn.

4. Lưu ý khi triển khai IDisposable

  • Tránh gọi Dispose() nhiều lần: Cần đảm bảo rằng việc gọi Dispose() nhiều lần không gây lỗi, thường bằng cách kiểm tra trạng thái đã giải phóng tài nguyên.
  • Kế thừa và Dispose(): Khi lớp của bạn kế thừa từ lớp khác triển khai IDisposable, hãy chắc chắn gọi Dispose() của lớp cơ sở để đảm bảo tất cả tài nguyên được giải phóng.

Việc hiểu và áp dụng đúng giao diện IDisposable cùng từ khóa using là quan trọng để quản lý tài nguyên hiệu quả trong ứng dụng C#.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *