我正在将一个1.1的winforms应用程序迁移到2.0版本。由于泛型,我需要立即更改哪些主要内容呢?以下是我目前的进展:
- 使用通用字典替换所有哈希表
- 使用List<>替换所有ArrayList
- 使用: List<>替换所有CollectionBase派生类
还有其他需要立即更改的吗?
谢谢, ak
我认为不应该立即采取任何行动!1.1版本的代码是可用的,对吧?全面转向泛型的商业案例在哪里?在2.0下编译应用程序,使其运行并经过测试。然后,当需要新功能以充分利用泛型时,将这些功能实现为泛型。
还有其他需要立即完成的吗?
通常情况下,尽可能将任何提到 IEnumerable
的内容更改为 IEnumerable<T>
。可以通过切换整个命名空间来大大帮助迁移,即在每个文件中取消导入 System.Collections
并改为导入 System.Collections.Generic
。
此外,搜索代码中提到 object
和/或使用装箱的地方,并考虑这是否仍然合适或应该替换为泛型。
正如jalf 在评论中提醒我的那样,另一个重要的更改是在适用的情况下切换到 IComparable
的通用版本。
由于其表现力,通常更喜欢使用通用集合。但需要注意的是,如果从非通用集合进行更改,则有时行为可能与您预期的不同。例如,在哈希表(Hashtable)和字典(Dictionary)上使用索引器时,对于不存在的值,它们将有不同的行为。哈希表将返回 null,而字典将抛出异常。
Hashtable ht = new Hashtable();
ht.Add(1, "one");
string s1 = ht[1; // s1="one"
string s2 = ht[2]; // s2=null
var dic = new Dictionary<int, string>();
dic.Add(1, "one");
string s1 = dic[1]; // s1="one"
string s2 = dic[2]; // throws KeyNotFoundException
处理这种情况的常见方法是使用以下技术:
string s = null;
if (dic.TryGetValue(k, out s))
{
// if we're here, k was found in the dictionary
}
这个只会在运行时显示,所以提前了解是值得的。
List<T>
替代 CollectionBase
。相反,Collection<T>
给你可比较的重写。除非您已经拥有一套具有良好代码覆盖率的单元测试套件,否则不要无谓地更改任何内容。
否则,您只是在自找麻烦,更不用说发明了一些无意义的工作...