我有一个大型项目,最初是用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,但我忽略了什么?
答案 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
方法(抑制其他重载时的警告),然后稳定地移至'正确'版本。
完成后,您可以将真实方法转换为依赖类型安全泛型的方法并删除链接。