2014-10-30 13 views
1

我有一個列表框,其中有3個項目,每次只能選擇1個項目。這些項目的屬性可以從不同的類別訪問 - Alto,Zen,Esteem。我一次只需要使用一節課。 我將這些類存儲在列表數組中。我如何處理我想要的類(根據我的邏輯)?類陣列如何從列表中處理類對象<object>

List<object> lst = new List<object>(); 

列表添加每一類對象,列出

Alto objAlto = new Alto(); 
Zen objZen = new Zen(); 
Esteem objEsteem = new Esteem(); 

lst.Add(objAlto); 
lst.Add(objZen); 
lst.Add(objEsteem); 

我的邏輯來處置

enter image description here

現在的問題是,我該怎麼處理對象?爲什麼我無法獲得「.Dispose」?我是否缺少任何隱式轉換來使用此功能?

+0

實現'IDisposable'上的課程和提供一個'Dispose'方法,目前你有'名單',你需要一個'列表'與'IDisposable'實施。還有一件事,你確定你需要'Dispose'嗎?你是否處理任何非託管資源。 – Habib 2014-10-30 12:51:43

回答

1

爲了增加d斯坦利的答案,怎麼樣這樣:

foreach(var o in lst.OfType<IDisposable>()) 
{ 
    o.Dispose(); 
} 
+0

+1更清潔... – 2014-10-30 14:17:55

+0

即使o。Dispose()被調用,爲什麼實際的對象沒有被拋棄?有沒有像使用「ref」(只是一個例子)來處理實際對象的方法? – 2014-10-31 04:47:11

+0

你認爲'Dispose'應該做什麼? 「IDisposable」實現中的Dispose方法清除對非託管資源的引用以及對自身具有對非託管資源的引用的託管對象的引用。 – 2014-10-31 05:02:12

0

爲什麼我無法獲得「.Dispose」?

因爲yout list是tyoe List和DisposeIDisposable接口的方法。如果您的列表是IDisposable(或實現IDisposable的某種類型),則可以直接撥打Dispose

我是否缺少任何隱式轉換以利用此功能?

這裏沒有一個轉換,但如果對象實現IDisposable你可以明確地丟掉。

foreach(object o in lst) 
{ 
    if(o is IDisposable) 
     ((IDisposable)o).Dispose(); 
} 

但是有一對夫婦設計奇特,我看到的:

  • 名單的對象通常是一種代碼味道。如果對象全部實現通用接口或具有公共基類(除Object之外),則最好使用更具體類型的列表。
  • 通常,無論是否創建了,對象都有責任對其進行處置。另一種方法是製作任何包含對象的工具IDisposable
+0

即使調用了o.Dispose(),爲什麼實際的對象沒有被處置?有沒有像使用「ref」(只是一個例子)來處理實際對象的方法? – 2014-10-31 04:47:46

+0

你想做什麼? '.dispose'不會從內存中移除對象 - 垃圾收集器會這樣做,並且只有當沒有任何東西持有對它的引用時 - 才能讓垃圾回收器清理您需要從對象列表中刪除它們的對象。 – 2014-10-31 12:22:50