天天看點

C# using的使用-資源回收

using (Line line = new Line())
            {
                // 設定線條長度
                line.setLength(6.0);
                Console.WriteLine("線條的長度: {0}", line.getLength());
            }
           

using {}裡面的代碼執行完成後,會自動調用對象的 Dispose()方法。

但是對象的析構函數不會被調用,隻有當系統判斷該對象不再使用時才會被自動調用。

是以:

C# using的使用-資源回收
注意
不應使用空析構函數。如果類包含析構函數,Finalize 隊列中則會建立一個項。調用析構函數時,将調用垃圾回收器來處理該隊列。如果析構函數為空,則隻會導緻不必要的性能丢失。

using 語句中使用的類型必須繼承并實作接口“System.IDisposable”  

class Line : System.IDisposable
        {
            private double length;   // 線條的長度
            public Line()  // 構造函數
            {
                Console.WriteLine("對象已建立");
            }
            ~Line() //析構函數
            {
                Console.WriteLine("對象已删除");
            }

            public void setLength(double len)
            {
                length = len;
            }
            public double getLength()
            {
                return length;
            }

            public void Dispose()
            {
                Console.WriteLine("對象已Dispose");
            }
        }
           

程式員無法控制何時調用析構函數,因為這是由垃圾回收器決定的。垃圾回收器檢查是否存在應用程式不再使用的對象。如果垃圾回收器認為某個對象符合析構,則調用析構函數(如果有)并回收用來存儲此對象的記憶體。程式退出時也會調用析構函數。

可以通過調用 Collect 強制進行垃圾回收,但大多數情況下應避免這樣做,因為這樣會導緻性能問題。有關更多資訊,請參見強制垃圾回收。

使用析構函數釋放資源

通常,與運作時不進行垃圾回收的程式設計語言相比,C# 無需太多的記憶體管理。這是因為 .NET Framework 垃圾回收器會隐式地管理對象的記憶體配置設定和釋放。但是,當應用程式封裝視窗、檔案和網絡連接配接這類非托管資源時,應當使用析構函數釋放這些資源。當對象符合析構時,垃圾回收器将運作對象的 Finalize 方法。

源的顯式釋放

如果您的應用程式在使用昂貴的外部資源,則還建議您提供一種在垃圾回收器釋放對象前顯式地釋放資源的方式。可通過實作來自 IDisposable 接口的 Dispose 方法來完成這一點,該方法為對象執行必要的清理。這樣可大大提高應用程式的性能。即使有這種對資源的顯式控制,析構函數也是一種保護措施,可用來在對 Dispose 方法的調用失敗時清理資源。

using的用法:

1. using指令:引入命名空間

這是最常見的用法,例如:

using System;
using Namespace1.SubNameSpace;      

2. using static 指令:指定無需指定類型名稱即可通路其靜态成員的類型

using static System.Math;var = PI; // 直接使用System.Math.PI      

3. 起别名

using Project = PC.MyCompany.Project;      

4. using語句:将執行個體與代碼綁定

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}      

代碼段結束時,自動調用font3和font4的Dispose方法,釋放執行個體。

參考資料

繼續閱讀