Lớp học của tôi chứa một đối tượng từ Interop và gọi một phương thức trên đó làm cho nó phân bổ nội dung. Nó cũng đưa ra một phương pháp để giải phóng nội dung đó, vì vậy tôi hy vọng tôi nên gọi điều này trong Dispose():Làm cách nào để triển khai mẫu vứt bỏ trong C# khi gói một đối tượng COM Interop?
class MyClass : IDisposable
{
private DllName.ComClassName comInstance;
void SomeMethod()
{
comInstance = new DllName.ComClassName();
comInstance.AllocStuff();
}
public void Dispose()
{
comInstance.FreeThatStuff();
}
}
Bây giờ, tôi nên mở rộng tất cả để theo mẫu Vứt bỏ. Tôi không có nguồn lực dùng một lần hoặc không được quản lý khác để phát hành, vì vậy giả sử comInstance được quản lý (không phải là những gì Interop không, kết thúc tốt đẹp không được quản lý vào quản lý?), Tôi nghĩ rằng disolves mẫu để:
public void Dispose()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
nào rò rỉ, trừ khi tôi rõ ràng gọi Dispose() trên các trường hợp của MyClass, điều này sẽ làm cho mẫu Dispose bị thiếu sót? Vì vậy, điều đó có nghĩa comInstance phải được quản lý, và các mô hình disolves tới:
public void Dispose()
{
DisposeComInstance();
GC.SuppressFinalize(this);
}
~MyClass()
{
DisposeComInstance();
}
private void DisposeComInstance()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
EDIT:
- Để tránh làm lộn xộn lớp học của tôi với mô hình đầy đủ, tôi có thể chỉ niêm phong lớp học của tôi?
- Làm cách nào để biết ComClassName (và nói chung là bất kỳ lớp học nào) không được quản lý?
Siêu nhận xét: hãy chắc chắn rằng Dispose (bool) của bạn có thể chịu đựng được gọi nhiều lần liên tiếp. Cũng cố gắng để giảm thiểu khả năng của một ngoại lệ được ném (không phải lúc nào cũng có thể). – user7116
Nhận xét meta meta - cũng như điều đó, điều quan trọng là bạn không bao giờ có được khóa hoặc sử dụng khóa trong khi dọn dẹp không được quản lý của bạn. – womp