2016-09-20 93 views
-1

是什麼什麼是設置

代碼下面的代碼之間的差1之前清除收集的重要性:

if(RecordCollections!=null){ 
    RecordCollections.Clear(); 
    RecordCollections=null; 
} 

代碼2:

RecordCollections = null; 

的代碼本內a Dispose方法,在使集合爲空之前使用Clear方法是否有優勢?是否需要它?

+1

它可以幫助http://stackoverflow.com/questions/11717416/clearing-a-private-collection-or-setting-it-to-null –

+0

@ Dev.Joel:你的鏈接問題涉及到一個類將繼續在調用Reset()方法之後使用它(首先,類中的可疑特性,因爲假設這種方法的合理實現,可以簡單地通過分配一個新實例來完成)。在這裏,OP在詢問正在處理的對象;因爲按照慣例,一旦一個對象調用了Dispose()方法後該對象就不應該被使用,因此可以放心地認爲被放置的對象實際上不會被再次使用,所以在其他答案中提到的(邊際)好處不會被使用不適用。 –

回答

3

在將Collection設置爲null之前使用Clear方法是否有優勢?

沒有好的說不出口Minimal, Complete, and Verifiable code example

也就是說,這些代碼片段對我來說看起來都非常有用。如果Clear()方法所做的只是清空集合,那麼第一個肯定是沒有意義的。當然,如果它實際上經過並且例如每個收集成員都稱爲Dispose(),這可能會有所不同。但這將是一個非常不尋常的集合實現。

即使是第二個也沒有什麼價值,並且違背了正常的IDisposable語義。 IDisposable應該只是用於管理非託管資源。它有時用於其他的事情,但這是它的主要目的。具體而言,通常只在丟棄對象之前調用Dispose()。如果對象本身將被丟棄,那麼它對其他對象(例如集合)的任何引用將不再可達,因此將它們設置爲null沒有任何有用的效果。

事實上,在某些情況下設置一個變量爲null實際上可以延長一個對象的生命週期。運行時足夠複雜,可以識別變量不再使用,並且如果它保留了最後一個對象的剩餘引用,那麼即使變量的作用域進一步擴展,對象也可以變爲符合垃圾回收的條件。通過將該變量設置爲null,該變量本身稍後在程序中使用,因此運行時不能將其視爲在該點之前無法訪問,遲於其他情況。

最後一點通常適用於局部變量,而不是對象中的字段。但理論上運行時可以更廣泛地進行優化。這是一個不好的習慣,去設置null變量,他們自己不會在更長的時間。

1

Dispose指的是一種機制,明確清理un-managed memory,因爲不能使用標準Garbage Collector進行清理,主要是IDisposable將由類,它在內部使用非託管API像Database Connection實現。

標準的做法是:

  • ,也能實現沿Finalizer,因爲Dispose是一個明確的呼叫,如果主叫方錯過了再定稿並照顧的清理行動,但它需要2個週期GC。

  • 如果一個類使用任何一個對象,作爲一個類變量,它自己實現了一個Dispose,那麼應該執行Dispose來調用類變量的Dispose

關於提供的代碼:

if(RecordCollections!=null){ 
    RecordCollections.Clear(); 
    RecordCollections=null; 
} 

或者

RecordCollections = null; 

由於這是關係到清理託管內存,它有什麼用處,因爲GC做的主要工作,並沒有按不需要它,但在我看來,它是一個acceptable practice,其中類變量被明確地取消,這使得用戶改變每一個分配,並且大部分嘗試應該被做出t o使用方法局部變量,直到和除非狀態需要在方法調用之間共享。對象分配誤用,可以更加控制。

至於差異而言,雖然集合明確地清除,然後無效或只是無效,內存保持不變,直到點GC被調用,這是un-deterministic,但在我看來,它不是很清楚,怎麼GC是否明確映射了用於收集的對象,這些對象是不可訪問的,但對於不同的世代,特別是較高的對象(提升對象),如果對象明確標記爲null,則GC可能必須花費較少/無時間跟蹤根/參考,但是沒有明確的文檔來解釋這個方面/實現。