我正在将应用程序从.NET 1.1迁移到.NET 2.0。我应该删除CollectionBase的所有用途吗?如果是这样,迁移的最佳策略是什么?
答案 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隐式,你开始到哪一端并不重要)