这是不是在C++/CLI那么明显,但它的工作原理究竟它在C#的方式。您可以在使用对象浏览器查看课程时看到它。或者像ildasm.exe这样的反编译器,看看它有什么作用。
当你编写析构函数时,C++/CLI编译器会自动生成一堆代码。它实现了一次性模式,即使你没有这样声明,你的类也会自动实现IDisposable。你得到一个公共的Dispose()方法,一个受保护的Dispose(bool)方法和一个自动调用GC :: SuppressFinalize()。
在C++/CLI中使用delete
来显式调用它,编译器会发出Dispose()调用。通过使用堆栈语义,您可以在C++/CLI中获得相当于RAII的结果,编译器会自动在范围块末尾发出Dispose调用。 C++程序员熟悉的语法和行为。
如果这个类是用C#编写的,那么你会在C#中做同样的事情。您可以调用Dispose()来显式调用,您可以使用using
语句以隐式方式以异常安全的方式调用它。
否则相同的规则适用,您只需要需要析构函数,当您需要释放一些不受管理的内存时。几乎总是一个本地对象,即您在构造函数中分配的对象。考虑一下,如果这个非托管对象很小并且GC :: AddMemoryPressure()是一个非常体面的选择,它可能不值得费神。但是,您必须在这样的包装类中实现终结器(!ClassName()
)。你不能强制外部客户端代码调用Dispose(),这样做是可选的,并且经常被遗忘。你不希望这样的疏忽导致非托管内存泄漏,终结器确保它仍然被释放。通常编写析构函数的最简单的方法是明确调用终结器(this->!ClassName();
)
我不明白,[Dispose`]有什么问题(http://msdn.microsoft.com/en-us/ library/system.idisposable.dispose.aspx)方法?没有它就无法实现一次性模式。 – 2011-02-08 15:51:58
C++/CLI类不公开`Dispose()`方法。它隐含在C++/CLI(如`〜MyClass`)的析构函数的语法中,但是当从C#引用对象时,您没有暴露的Dispose()方法,就像我所知道的那样。 – JimEvans 2011-02-08 15:54:19