Tôi đã một lớp C++/CLI có tên là "CTransferManaged" với finalizer thực hiện và destructor:C#/CLI: Destructor không được gọi nếu Dispose() được sử dụng trong nó
CTransferManaged::~CTransferManaged()
{
this->!CTransferManaged();
}
CTransferManaged::!CTransferManaged()
{
//Clean up resources...
}
Lớp này được bao bọc bởi một lớp C# tên "CTransfer" chứa một đối tượng m_transfer thuộc loại CTransferManaged.
Nếu destructor của lớp này chỉ xóa tham chiếu đến đối tượng m_transfer Tôi có thể thấy rằng các destructor được gọi là (breakpoint là hit):
~CTransfer()
{
m_transfer = null; //breakpoint on this line
}
Nếu tôi gọi Dispose() chức năng của m_transfer đối tượng mà không thay đổi bất cứ điều gì khác, destructor không được gọi nữa (breakpoint không có hit nhiều hơn). Bất kỳ đoán tại sao?
~CTransfer()
{
m_transfer.Dispose(); //breakpoint on this line
m_transfer = null;
}
Tôi muốn gọi Dispose() bằng tay kể từ khi tôi phát hiện ra rằng các nguồn lực của đối tượng C++/CLI (m_transfer) đều không được làm sạch đúng cách nếu tôi không gọi Vứt bỏ bằng tay. Tại thời điểm này tôi không biết chính xác lý do tại sao.
Tại sao trình hủy của CTransfer (C# class) không được gọi ngay khi nó gọi CTransferManaged :: Dispose() (C++/CLI)?
Lớp CTransfer của bạn * phải * triển khai IDisposable để có thể xử lý đúng thành viên m_transfer. Có vẻ như bạn đã làm điều đó. Do ** not ** thực hiện một finalizer cho CTransfer. Đặt một thành viên thành null không có tác dụng hữu ích và gọi phương thức Dispose() của nó là sai. –
@HansPassant: Tại sao nó sai khi gọi phương thức Dispose() của đối tượng thành viên (m_transfer) trong trình hoàn thiện của CTransfer? Như tôi đã đề cập, tôi phát hiện ra rằng tài nguyên của m_transfer không được dọn dẹp đúng cách khi tôi không gọi Dispose() trên nó (
obruend