将参数从ArrayList迁移到List <t> </t>

时间:2009-07-07 19:22:59

标签: c# generics .net-2.0

我有一个大型项目,最初是用C#1.1编写的,现在面向C#2.0。有几个类有一些方法,它们采用一个ArrayList参数我想开始将它们移动到接受List<T>作为参数,但这不能一次完成所有,所以我需要接受这两个参数。

迁移的主要原因是List<>个对象将被接受作为参数,但我还想利用类型安全性。

已考虑

1)创建重载并复制代码。   这样做的好处是允许我将旧样式代码标记为过时,但显然重复代码很糟糕。

2)将参数更改为IEnumerable:  这样做的好处是可以使用旧代码和新代码,但不是类型安全的,因为它接受List<T1>应该是List<T2>

3)重新编写方法以获取List<T>参数并编写一个瘦包装器,该包装器接受一个ArrayList参数并将项目复制到新的List<T>,然后调用main方法。这也有一个好处,就是允许我将旧样式代码标记为过时。它会有轻微的性能/ GC命中率。

4)创建三个重载。一个私有方法,它采用IEnumerable和两个公共包装器方法(一个用于ArrayList,一个用于List<T>),它们只调用私有方法。 这也有一个好处,就是允许我将旧样式代码标记为过时。除了有三种方法之外,不确定它是否有任何不利之处。

我倾向于4,但我忽略了什么?

3 个答案:

答案 0 :(得分:6)

绝对使用#2的变体,您可以在IEnumerable<T>而不是List<T>进行搜索。对于那些需要IEnumerable<T>以上的人,您的目标应该是IList<T>

对于那些可以迁移到IEnumerable<T>的方法,您可以将它们短时间移动到IEnumerable,这样就可以避免需要维护该方法的两个副本。然后,在大多数ArrayLists消失后,您可以轻松完成向IEnumerable<T>的移动。

答案 1 :(得分:0)

如果你需要操作而不是枚举功能,我会创建一个完整的IEnumerable<t>套件(或者IList<t>)参数方法,并将它们作为完成所有工作的默认方法。为了与您的ArrayList契约兼容,您可以将原始的ArrayList方法转换为IEnumerable<t>并调用IEnumerable方法。

基本上将工作转移到更加类型安全的选项,并为旧合同创建外观。

答案 2 :(得分:0)

我想补充一下Joel的优秀答案,你可以避免复制开销,在你的过渡阶段,使用现有方法作为你的“真实”方法,只需从IEnumerable<T>重载调用{{1一个。

这将是一个快速而简单的变化,almos没有引入二进制不兼容性。

您可以使用IEnumerable标记IEnumerable方法(抑制其他重载时的警告),然后稳定地移至'正确'版本。

完成后,您可以将真实方法转换为依赖类型安全泛型的方法并删除链接。