最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

全面解讀C#編程中的析構(gòu)函數(shù)用法

 更新時間:2016年01月30日 17:44:26   投稿:goldensun  
這篇文章主要介紹了C#編程中的析構(gòu)函數(shù)用法,文中最后還整理了析構(gòu)函數(shù)與Dispose()方法的區(qū)別,需要的朋友可以參考下

析構(gòu)函數(shù)用于析構(gòu)類的實例。
備注
不能在結(jié)構(gòu)中定義析構(gòu)函數(shù)。只能對類使用析構(gòu)函數(shù)。
一個類只能有一個析構(gòu)函數(shù)。
無法繼承或重載析構(gòu)函數(shù)。
無法調(diào)用析構(gòu)函數(shù)。它們是被自動調(diào)用的。
析構(gòu)函數(shù)既沒有修飾符,也沒有參數(shù)。
例如,下面是類 Car 的析構(gòu)函數(shù)的聲明:

class Car
{
 ~Car() // destructor
 {
  // cleanup statements...
 }
}

該析構(gòu)函數(shù)隱式地對對象的基類調(diào)用 Finalize。這樣,前面的析構(gòu)函數(shù)代碼被隱式地轉(zhuǎn)換為以下代碼:

protected override void Finalize()
{
 try
 {
  // Cleanup statements...
 }
 finally
 {
  base.Finalize();
 }
}

這意味著對繼承鏈中的所有實例遞歸地調(diào)用 Finalize 方法(從派生程度最大的到派生程度最小的)。

注意
不應(yīng)使用空析構(gòu)函數(shù)。如果類包含析構(gòu)函數(shù),F(xiàn)inalize 隊列中則會創(chuàng)建一個項。調(diào)用析構(gòu)函數(shù)時,將調(diào)用垃圾回收器來處理該隊列。如果析構(gòu)函數(shù)為空,只會導致不必要的性能損失。
程序員無法控制何時調(diào)用析構(gòu)函數(shù),因為這是由垃圾回收器決定的。垃圾回收器檢查是否存在應(yīng)用程序不再使用的對象。如果垃圾回收器認為某個對象符合析構(gòu),則調(diào)用析構(gòu)函數(shù)(如果有)并回收用來存儲此對象的內(nèi)存。程序退出時也會調(diào)用析構(gòu)函數(shù)。
可以通過調(diào)用 Collect 強制進行垃圾回收,但大多數(shù)情況下應(yīng)避免這樣做,因為這樣會導致性能問題。
使用析構(gòu)函數(shù)釋放資源
通常,與運行時不進行垃圾回收的開發(fā)語言相比,C# 無需太多的內(nèi)存管理。這是因為 .NET Framework 垃圾回收器會隱式地管理對象的內(nèi)存分配和釋放。但是,當應(yīng)用程序封裝窗口、文件和網(wǎng)絡(luò)連接這類非托管資源時,應(yīng)當使用析構(gòu)函數(shù)釋放這些資源。當對象符合析構(gòu)時,垃圾回收器將運行對象的 Finalize 方法。
資源的顯式釋放
如果您的應(yīng)用程序在使用昂貴的外部資源,我們還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式??赏ㄟ^實現(xiàn)來自 IDisposable 接口的 Dispose 方法來完成這一點,該方法為對象執(zhí)行必要的清理。這樣可大大提高應(yīng)用程序的性能。即使有這種對資源的顯式控制,析構(gòu)函數(shù)也是一種保護措施,可用來在對 Dispose 方法的調(diào)用失敗時清理資源。

下面的示例創(chuàng)建三個類,這三個類構(gòu)成了一個繼承鏈。類 First 是基類,Second 是從 First 派生的,而 Third 是從 Second 派生的。這三個類都有析構(gòu)函數(shù)。在 Main() 中,創(chuàng)建了派生程度最大的類的實例。注意:程序運行時,這三個類的析構(gòu)函數(shù)將自動被調(diào)用,并且是按照從派生程度最大的到派生程度最小的次序調(diào)用。

class First
{
 ~First()
 {
  System.Diagnostics.Trace.WriteLine("First's destructor is called.");
 }
}

class Second : First
{
 ~Second()
 {
  System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
 }
}

class Third : Second
{
 ~Third()
 {
  System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
 }
}

class TestDestructors
{
 static void Main()
 {
  Third t = new Third();
 }

}

輸出:

 Third's destructor is called.
 Second's destructor is called.
 First's destructor is called.


析構(gòu)函數(shù)與Dispose()方法的區(qū)別
1. Dispose需要實現(xiàn)IDisposable接口。

2. Dispose由開發(fā)人員代碼調(diào)用,而析構(gòu)函數(shù)由GC自動調(diào)用。

3. Dispose方法應(yīng)釋放所有托管和非托管資源。而析構(gòu)函數(shù)只應(yīng)釋放非托管資源。因為析構(gòu)函數(shù)由GC來判斷調(diào)用,當GC判斷某個對象不再需要的時候,則調(diào)用其析構(gòu)方法,這時候該對象中可能還包含有其他有用的托管資源。

4. 通過系統(tǒng)GC頻繁的調(diào)用析構(gòu)方法來釋放資源會降低系統(tǒng)性能,所以推薦顯示調(diào)用Dispose方法。

5. Dispose方法結(jié)尾處加上代碼“GC.SuppressFinalize(this);”,即告訴GC不需要再調(diào)用該對象的析構(gòu)方法,否則,GC仍會在判斷該對象不再有用后調(diào)用其析構(gòu)方法,雖然程序不會出錯,但影響系統(tǒng)性能。

6、析構(gòu)函數(shù) 和 Dispose 釋放的資源應(yīng)該相同,這樣即使類使用者在沒有調(diào)用 Dispose 的情況下,資源也會在 Finalize 中得到釋放。

7、Finalize 不應(yīng)為 public。

8、有 Dispose 方法存在時,應(yīng)該調(diào)用它,因為 Finalize 釋放資源通常是很慢的。

相關(guān)文章

  • C#遞歸應(yīng)用之實現(xiàn)JS文件的自動引用

    C#遞歸應(yīng)用之實現(xiàn)JS文件的自動引用

    這篇文章主要為大家詳細介紹了C#如何利用遞歸實現(xiàn)JS文件的自動引用的功能,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以參考一下
    2023-03-03
  • C#中FileSystemWatcher的使用教程

    C#中FileSystemWatcher的使用教程

    這篇文章主要給大家介紹了關(guān)于C#中FileSystemWatcher使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換實戰(zhàn)案例

    C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換實戰(zhàn)案例

    最近由于編程的需要,對C#的類型轉(zhuǎn)換做了一些研究,下面這篇文章主要給大家介紹了關(guān)于C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • C#比較日期的方法總結(jié)

    C#比較日期的方法總結(jié)

    在本篇內(nèi)容中小編給大家整理了關(guān)于C#比較日期的方法和相關(guān)知識點,有需要的朋友們學習下。
    2019-02-02
  • C#創(chuàng)建一個可快速重復使用的項目模板(詳細過程)

    C#創(chuàng)建一個可快速重復使用的項目模板(詳細過程)

    這篇文章主要介紹了C#如何創(chuàng)建一個可快速重復使用的項目模板今天給大家介紹的是基于官方的cli donet new 命令創(chuàng)建自己的項目模板,需要的朋友可以參考下
    2024-06-06
  • C#實現(xiàn)DevExpress本地化實例詳解

    C#實現(xiàn)DevExpress本地化實例詳解

    這篇文章主要介紹了C#實現(xiàn)DevExpress本地化,以實例形式較為詳細的分析了DevExpress本地化的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • Unity Shader實現(xiàn)描邊OutLine效果

    Unity Shader實現(xiàn)描邊OutLine效果

    這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)描邊OutLine效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • c#中如何獲取指定字符前的字符串

    c#中如何獲取指定字符前的字符串

    這篇文章主要介紹了c#中如何獲取指定字符前的字符串問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • C#中的虛方法和抽象方法的運用

    C#中的虛方法和抽象方法的運用

    這篇文章主要介紹了C#中的虛方法和抽象方法的運用,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#使用timer實現(xiàn)的簡單鬧鐘程序

    C#使用timer實現(xiàn)的簡單鬧鐘程序

    這篇文章主要介紹了C#使用timer實現(xiàn)的簡單鬧鐘程序,涉及timer控件的使用及音頻文件的操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03

最新評論

三亚市| 河南省| 洛南县| 科技| 海宁市| 兴安县| 义马市| 隆子县| 论坛| 齐齐哈尔市| 敦化市| 夏邑县| 安阳县| 鲁山县| 鄂伦春自治旗| 沐川县| 泸溪县| 邓州市| 方正县| 青岛市| 响水县| 滨州市| 宜黄县| 巨鹿县| 江都市| 水富县| 龙海市| 深泽县| 绥棱县| 兴安县| 黔西县| 南和县| 依安县| 宁津县| 剑河县| 申扎县| 内黄县| 阳新县| 仲巴县| 拜城县| 洱源县|