2012-05-26 18 views
2

我在處置和最終確定之間進入神經。這裏是我的示例代碼:C#處置:處置時和處置它

public class Car:IDisposable 
    { 
     public string name; 
     public Car() 
     { 
      name = "My Car"; 
     } 
     public void Dispose() 
     { 
      Console.WriteLine("This object has been disposed"); 
     } 
    } 
public static void Main() 
     { 
      Car anotherCar; 
      using (var car = new Car()) 
      { 
       anotherCar = car; 
       Console.WriteLine("Before dispose. Name is: "+anotherCar.name); 
      } 

      Console.WriteLine("After dispose. Name is: "+anotherCar.name); 

     } 

結果是:

Before dispose. Name is My Car 
This object has been disposed 
After dispose. Name is My Car 

我的問題是:因爲C#會自動using{}後處理的對象,所以我覺得在行「處置後」。 anotherCar.name必須爲NULL。爲什麼它仍然是「我的車」?

而我的另一個問題是:我的書說,你不應該使用GC.Collect()出於某種原因,其中之一是性能。那麼,誰處置對象?如果是垃圾收集器,也讓我覺得dipose()finalizer()

謝謝:)

回答

5

我想你是誤會什麼實際處置做了同樣的性能問題。它不會破壞你的對象,將任何東西設置爲null,或者執行任何類型的魔法。當你使用using語句時,只保證Dispose被調用。你在Dispose方法中做什麼決定了你的對象的行爲。不是語言或.NET框架。

4

如果您再次查看代碼,您會立即意識到只需在類上放置Dispose()方法並實現IDisposable不會添加任何幕後魔法,這只是一種常規方法,具有增加的便利性將在使用說明結束時被調用。

你應該小心清除你想自己釋放任何(非託管)的資源,例如關閉數據庫連接或開放供讀/保存文件的Dispose方法

一般...

微軟關於正確實現IDisposable有一個很好的help page

2

.net中的一個對象通常是一個類型引用以及該類型所需的公有和私有字段(有一些特殊情況,如數組和字符串)的組合。一旦創建,只要某種形式的引用存在,.net中的對象將繼續存在。一旦不再有任何對象的引用,如果將有效地停止存在;它所佔用的任何內存將僅僅是未使用的內存,有資格在下一次垃圾回收時重用。

Dispose的目的不是破壞對象,而是允許對象在消失之前用以外的東西執行必要的動作。作爲一個簡單的例子,假設一個對象要求遠程服務器授予它獨佔訪問文件的權限;服務器提供一個令牌,並承諾訪問只會授予提供該令牌的代碼。如果對象簡單地消失,則外部服務器會將該文件保留爲鎖定狀態,以便獨佔使用包含不再存在令牌的代碼。換句話說,該文件將永遠(*)無法被任何人使用。向請求令牌的對象添加Dispose方法將允許對象向服務器發送「好 - 我已完成文件XYZ1493」消息,從而使該文件可用於其他實體。

請注意,Dispose方法並不實際銷燬文件對象。它可能會提示對象刪除存儲在其字段中的一些數據,但只要對該對象的引用存在,該對象就會繼續存在,並且此後將不再存在。在某些情況下,對對象調用Dispose可能會加速對象本身的消亡,通過詢問其他外部對象持有對其的引用來銷燬這些引用。但是,即使在這些情況下,Dispose的目的也是允許對象向其他事物發出請求。