這是不是在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