C# 如何从列表中处置类对象<;对象>;

C# 如何从列表中处置类对象<;对象>;,c#,.net,object,garbage-collection,dispose,C#,.net,Object,Garbage Collection,Dispose,我有一个列表框,其中有3个项目,其中一次只能选择1个项目。这些物品的属性可以从不同的类别中访问-Alto、Zen、Reference。我一次只需要使用一个类。 我将这些类存储在一个列表数组中。如何配置所需的类(根据逻辑) 类数组列表 List<object> lst = new List<object>(); 我的处理逻辑 现在我的问题是,我如何处理这些对象?为什么我不能得到“.Dispose”?我是否缺少任何利用此功能的隐式转换 为什么我不能得到“.Dispose”

我有一个列表框,其中有3个项目,其中一次只能选择1个项目。这些物品的属性可以从不同的类别中访问-Alto、Zen、Reference。我一次只需要使用一个类。 我将这些类存储在一个列表数组中。如何配置所需的类(根据逻辑)

类数组列表

List<object> lst = new List<object>();
我的处理逻辑

现在我的问题是,我如何处理这些对象?为什么我不能得到“.Dispose”?我是否缺少任何利用此功能的隐式转换

为什么我不能得到“.Dispose”

因为yout list是tyoe list,而
Dispose
IDisposable
接口的一种方法。如果列表的类型为
IDisposable
(或实现
IDisposable
)的某个类型,则可以直接调用
Dispose

我是否缺少任何利用此功能的隐式转换

没有隐式转换,但如果对象实现了
IDisposable
,则可以显式强制转换它们:

foreach(object o in lst)
{
   if(o is IDisposable)
      ((IDisposable)o).Dispose();
}
然而,我看到了一些设计上的奇怪之处:

  • 对象列表通常是一种代码气味。如果对象都实现了一个公共接口或具有一个公共基类(而不是
    对象
    ),那么最好使用一个更具体类型的列表
  • 通常,创建对象的任何对象都负责处理它。另一种方法是使包含对象的内容也实现
    IDisposable

    • 要补充D Stanley的答案,那么:

      foreach(var o in lst.OfType<IDisposable>())
      {
         o.Dispose();
      }
      
      foreach(类型()的lst.OfType()中的变量o)
      {
      o、 处置();
      }
      
      在类上实现
      IDisposable
      ,并提供一个
      Dispose
      方法,目前您有
      List
      ,您需要一个
      List
      并实现
      IDisposable
      。还有一件事,你真的确定你需要处置吗?您是否正在处理任何非托管资源。即使调用了o.Dispose(),为什么实际对象没有得到处置?有没有像使用“ref”(只是一个示例)这样的方法来处理实际对象?您认为
      dispose
      应该做什么?
      IDisposable
      实现中的
      Dispose
      方法清除对非托管资源的引用以及对托管对象的引用,这些对象本身都引用了非托管资源。你说@SarathAvanavu是什么意思?当GC决定最佳时间时,它最终将被“处置”。即使调用了o.Dispose(),为什么实际对象没有得到处理?有没有像使用“ref”(只是一个示例)这样的方法来处理实际对象?您想做什么
      .Dispose
      不会从内存中删除对象-垃圾收集器会这样做,并且只有在没有任何对象包含对它的引用时才会这样做-因此要让垃圾收集器清理对象,您需要将它们从列表中删除。
      foreach(var o in lst.OfType<IDisposable>())
      {
         o.Dispose();
      }