CollectionBase与泛型

时间:2008-11-22 10:38:08

标签: c# .net generics

我正在将应用程序从.NET 1.1迁移到.NET 2.0。我应该删除CollectionBase的所有用途吗?如果是这样,迁移的最佳策略是什么?

3 个答案:

答案 0 :(得分:22)

是的,要查看的最佳类是在System.Collections.Generic中 我通常使用List。

您可以使用两种方法:

<强> A

public class MyClass
{
  public List<MyItem> Items;
}

<强>乙

public class MyItemCollection : List<MyItem>
{
}

public class MyClass
{
  public MyItemCollection Items;
}

这两种方法只是略有不同,如果您计划扩展List的功能,则只需要使用方法(B)。

这是一个包含更多信息的链接:
http://msdn.microsoft.com/en-us/library/6sh2ey19(VS.80).aspx

关于已经实现的类,可以删除IList接口中指定的所有函数。 e.g。

public int Add(InstrumentTradeDataRow instTrade) { return List.Add(instTrade); }

这可以删除,因为List已经为您实现了类型安全的添加功能。

有关更多信息,请参阅此链接:
http://msdn.microsoft.com/en-us/library/3wcytfd1(VS.80).aspx

答案 1 :(得分:16)

通常,List<T>会执行您通常想要的大部分内容。如果要自定义行为,则应继承Collection<T> - 这有virtual方法,因此您可以在添加/删除/更新等时调整行为。您无法使用List<T>执行此操作因为没有(有害的)virtual方法。

答案 2 :(得分:1)

我更喜欢Mark Ingrams A)方法,可能还有你自己编写的基类。

迁移到泛型还有另一个问题;转换具有某种病毒效应的倾向。你可能会发现在你完成之前不可能停下来。如果你认为你将花费几个小时来做​​一些仿制药,那么你经常会发现自己花了好几天做所有的仿制药。

您可以/应该通过向列表

提供新类运算符重载来避免这种情况
public static implicit operator MyClass(List m) 
{
   // code to convert from m to MyClass
}

public static explicit operator List(MyClass m) 
{
    // code to convert from MyClass list
}

这些只是权宜之计。您可以在以后的任何阶段使用“查找用法”来确定哪些地方尚未完全转换。删除所有用法后,您可以删除演员表。

我通常更喜欢将MyClass中的强制转换为List(这是你不想去的方式)而另一个隐含。

通常,最好的方法是从图层的顶部开始,靠近表示层并向下工作。 (这与你可能想到的相反。如果你把MyClass中的强制转换为List隐式,你开始到哪一端并不重要)