Nó không phải là quá rõ ràng trong C++/CLI nhưng nó hoạt động chính xác cách nó trong C#. Bạn có thể nhìn thấy nó khi bạn nhìn vào lớp với Object Browser. Hoặc một trình biên dịch ngược như ildasm.exe, cách tốt nhất để xem nó làm gì.
Khi bạn viết trình phá hủy, trình biên dịch C++/CLI tự động tạo một nhóm mã. Nó thực hiện mô hình dùng một lần, lớp của bạn sẽ tự động triển khai IDisposable, mặc dù bạn không khai báo nó theo cách đó. Và bạn có được một phương thức Dispose() công khai, một phương thức Dispose (bool) được bảo vệ và một cuộc gọi tự động tới GC :: SuppressFinalize().
Bạn sử dụng delete
trong C++/CLI để gọi một cách rõ ràng, trình biên dịch sẽ phát ra cuộc gọi Dispose(). Và bạn nhận được tương đương với RAII trong C++/CLI bằng cách sử dụng ngữ nghĩa ngăn xếp, trình biên dịch tự động phát ra cuộc gọi Dispose ở cuối khối phạm vi. Cú pháp và hành vi quen thuộc với các lập trình viên C++.
Bạn làm chính xác điều bạn sẽ làm trong C# nếu lớp học đã được viết bằng C#. Bạn gọi Dispose() để gọi một cách rõ ràng, bạn sử dụng câu lệnh using
để gọi nó một cách ngầm định một cách ngoại lệ.
Các quy tắc tương tự được áp dụng khác, bạn chỉ cần cần trình phá hủy khi bạn cần phát hành một thứ không được quản lý bộ nhớ. Hầu như luôn luôn là một đối tượng bản địa, cái mà bạn đã cấp phát trong hàm tạo. Hãy xem xét rằng nó có thể không có giá trị bận tâm nếu đối tượng không được quản lý là nhỏ và rằng GC :: AddMemoryPressure() là một thay thế rất phong nha. Tuy nhiên, bạn phải triển khai finalizer (!ClassName()
) trong lớp trình bao bọc như vậy. Bạn không thể ép buộc mã máy khách bên ngoài gọi Dispose(), làm như vậy là tùy chọn và nó thường bị lãng quên. Bạn không muốn một sự giám sát như vậy gây ra một rò rỉ bộ nhớ không được quản lý, finalizer đảm bảo rằng nó vẫn được phát hành. Thông thường, cách đơn giản nhất để viết trình phá hủy là gọi rõ ràng trình kết thúc (this->!ClassName();
)
Nguồn
2011-02-08 16:15:02
Tôi không hiểu, có gì sai với ['Dispose'] (http://msdn.microsoft.com/en-us/) thư viện/system.idisposable.dispose.aspx) phương pháp? Bạn không thể thực hiện mẫu dùng một lần mà không có nó. –
Lớp C++/CLI không hiển thị phương thức 'Dispose()'. Đó là ngầm định trong cú pháp giống như destructor của C++/CLI (ví dụ 'MyClass'), nhưng khi tham chiếu đối tượng từ C#, bạn không có phương thức' Dispose() 'tiếp xúc, gần như tôi có thể nói. – JimEvans