C#中的弱引用
阿新 • • 發佈:2019-01-02
一般情況下例項化一個類或結構時,只要有程式碼引用它,就會形成強引用。
例如:
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物件。