2011-03-22 41 views
2

我只是不知道在哪裏一些方法所使用的變量在方法的執行結束後走了,請參閱下面的代碼片段:這個變量是否在使用後處置?

void Foo() 
    { 
     List<object> conditionedObjList; 
     conditionedObjList = GetConditionedObjectList 
      (
      new List<object>() { /*there are many unconditioned objects here*/} 
      ); 
    } 

我的問題;是方法GetConditionedObjectList中定義的變量myObjList將在myObjList已返回之後處理還是我們需要手動處理?

private List<object> GetConditionedObjectList(List<object> originalObjList) 
    { 
     List<object> myObjList = new List<object>(); 
     /*do some selection*/ 
     myObjList.AddRange(new object[]{/*there are 100 conditioned objects here*/}); 
     return myObjList; 
    } 
+3

不清楚你正在嘗試做什麼。 'GetConditionedObjectList'完全忽略了它的傳入參數。 (也許這是不相關的,但它掩蓋了你的問題。)當對GetConditionedObjectList的調用返回時,本地變量(在Foo中)'conditionedObjList'將成爲你在'GetConditionedObjectList'中創建的列表'myObjList'的引用。當Foo退出時,將不再有對列表的引用,並且它將被標記爲垃圾收集。 – 2011-03-22 04:58:09

+1

聽起來像你在談論垃圾收集而不是處置(在.NET中具有不同的含義) – 2011-03-22 05:31:50

+0

Joel:想象T是字符串,在方法'GetConditionedObjectList'中,我從傳入參數originalObjList ,例如枚舉列表以檢查originalObjList中的元素是否是以「foo」開頭的字符串,然後將該元素添加到myObjList中。並返回myObjList。 – Restart 2011-03-22 07:02:31

回答

1

C#有垃圾回收。對象是在堆上創建的,只有當對象沒有更多引用時纔會收集對象。

myObjList只是將參考存儲到堆上的實際對象;當你返回這個引用並將它存儲到一個變量中時,你可以保證垃圾回收器(GC)不會將其提取出來。

如果通過「處置」你的意思是「銷燬」或「從內存中刪除」,那麼垃圾收集器會爲你做這件事;您只需刪除對該對象的引用即可。例如,您可以在調用該函數後將conditionedObjList設置爲null。然後GC可以自由選擇未被引用的對象。請注意,這不是直接的; GC只是定期運行以提高效率。

+1

僅僅將參考存儲在堆棧變量中並不能保證它不會被收集:http://www.codeneverwritten.com/2007/12/04/where-did-my-object-go-part-1/ – 2011-03-31 00:15:42

+1

@Curt:嗯,有趣。我嘗試了文章中的示例,但無法重現.NET 3.5上的行爲(調試和發佈的行爲一致,直到方法結束後才收集對象,但在主要結束之前)。偶然發生這種行爲也不太可能...... – Cameron 2011-03-31 02:09:53

1

如要返回對它的引用它不設置

如果在函數返回時沒有引用它,那麼它在本地僅用於本地函數時會超出範圍,因此GC可以自由收集它。

順便說一句List<T>沒有實現IDisposable,因此它不需要放置在您的代碼中。

1
  1. 該列表不執行IDisposable - 因此我們不需要處理它。
  2. 只要您沒有任何參考,它將被標記爲垃圾收集。
相關問題