2013-01-31 18 views
1

所以可以說我們有一些這樣的事websericeclient對象將未分配的對象變量處置自動

var myname = new WebServiceClient().GetName () ; 

會發生此對象是什麼(WebServiceClient此類())是它會自動銷燬或保留在內存中。

+0

你的意思是敲定而不是處置? –

回答

0

這取決於_GetName()_方法。並在_WebServiceClient()_

讓我們的例子:

public class WebServiceClient : IDisposable 
{ 
    private static WebServiceClient viciousReference = null; 

    public WebServiceClient() 
    { 
     viciousReference = this; 
    } 

    ~WebServiceClient() 
    { 
     Dispose(); 
    } 

    public void Dispose() 
    { 
     // Standard Dispose implementation 
    } 
} 

如果你的對象實現Dispose(),總是儘量調用它自己。不要只依靠垃圾收集器。

+0

所以你說它會被視爲它被分配給一個變量? – sino

+0

@sino不,我說它取決於_GetName()_和_WebServiceClient_的底層實現。您可能認爲垃圾收集器將最終化已創建的_WebServiceClient_實例,因爲您沒有將其分配給變量,但如果_WebServiceClient_構造函數像上面的代碼一樣實現,則仍然會引用創建的實例。所以,垃圾收集器將永遠不會最終確定它。 –

1

「Disposing」(調用IDisposable.Dispose())與內存無關。它與釋放非託管資源(如文件或數據庫句柄)有關。

當您不調用Dispose()時會發生什麼,這些資源將保留到垃圾收集器運行以從內存釋放對象時調用終結器。如果你需要這些資源(或者如果他們被Disposed()時發生了一些有趣的事情),那麼你不想等待一段時間 - 一旦完成它就調用Dispose()。