Tôi không nghĩ câu hỏi này đã được hỏi trước đây. Tôi là một chút bối rối về cách tốt nhất để thực hiện IDisposable
trên một lớp kín - đặc biệt, một lớp niêm phong mà không kế thừa từ một lớp cơ sở. (Đó là, một "lớp học kín tinh khiết" là thuật ngữ của tôi.)Thực hiện IDisposable trên lớp kín
Có thể một số bạn đồng ý với tôi rằng hướng dẫn thực hiện IDisposable
rất khó hiểu. Điều đó nói rằng, tôi muốn biết rằng cách tôi dự định thực hiện IDisposable
là đủ và an toàn.
Tôi đang thực hiện một số mã P/Invoke phân bổ IntPtr
đến Marshal.AllocHGlobal
và tự nhiên, tôi muốn xóa sạch bộ nhớ không được quản lý mà tôi đã tạo. Vì vậy, tôi đang nghĩ đến một cái gì đó như thế này
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public sealed class MemBlock : IDisposable
{
IntPtr ptr;
int length;
MemBlock(int size)
{
ptr = Marshal.AllocHGlobal(size);
length = size;
}
public void Dispose()
{
if (ptr != IntPtr.Zero)
{
Marshal.FreeHGlobal(ptr);
ptr = IntPtr.Zero;
GC.SuppressFinalize(this);
}
}
~MemBlock()
{
Dispose();
}
}
Tôi giả định rằng vì MemBlock
là hoàn toàn kín và không bao giờ xuất phát từ một lớp khác mà thực hiện một virtual protected Dispose(bool disposing)
là không cần thiết.
Ngoài ra, người hoàn tất có cần thiết không? Tất cả những suy nghĩ đều được chào đón.
Nhưng tất nhiên trong trường hợp đó một lớp niêm phong bắt nguồn từ một lớp cơ sở thì việc vứt bỏ ảo sẽ là cần thiết - đúng không? – zebrabox
Ngoài ra. Các finaliser có nghĩa là thêm vào một hàng đợi finalizer và có chi phí hiệu quả một thu gom rác đôi. Có vẻ như một hình phạt nặng nề phải trả cho việc sử dụng các tài nguyên không được quản lý. Là không có cách nào để tránh việc thực hiện hit? – zebrabox
Trong trường hợp đó, bạn sẽ 'ghi đè' phương thức. Bạn không thể khai báo bất kỳ phương thức nào trong lớp 'sealed' là' virtual'. Đó là một trình biên dịch ** lỗi **. –