1. 程式人生 > >C#中的弱引用

C#中的弱引用

一般情況下例項化一個類或結構時,只要有程式碼引用它,就會形成強引用。

例如:

Student stu=new Student();

對此,垃圾回收器就不能收集該物件。

一般而言是沒有問題的,因為可能需要訪問stu物件,但是如果物件過大,並且不經常訪問呢?此時就可以建立物件的弱引用。弱引用執行建立和使用物件,但是垃圾回收器執行時,就會回收物件釋放記憶體。但始終存在這樣的風險:垃圾回收器在重新建立強引用之前先處理該物件。但是在特定的情況下使用弱引用是很合理的。

使用 WeakReference類建立弱引用。因為物件可能在任意時刻被回收,所以在引用前必須確認它存在。

例:

      static void Main()
      {
         // 傳遞一個類的物件例項化mathReference
         WeakReference mathReference = new WeakReference(new MyClass());   
         MyClass myClass;
         if(mathReference.IsAlive)
         {
            myClass = mathReference.Target as MyClass;
            myClass.name = "ClassName";
           
			//....一些操作
         }
         else
         {
            Console.WriteLine("物件不存在");
         }

         GC.Collect();//呼叫垃圾回收器
         
         if(mathReference.IsAlive)
         {
            myClass = mathReference.Target as myClass;
         }
         else
         {
            Console.WriteLine("物件不存在");
         }
      }

用IsAlive屬性來檢查mathReference物件是否被回收。如果IsAlive為true,就從目標屬性得到MyClass物件的引用。

呼叫垃圾回收器後,IsAlive返回false,如果此時要使用MyClass物件,就必須例項化一個新的MyClass物件。