转向泛型。

6

我正在将一个1.1的winforms应用程序迁移到2.0版本。由于泛型,我需要立即更改哪些主要内容呢?以下是我目前的进展:

  1. 使用通用字典替换所有哈希表
  2. 使用List<>替换所有ArrayList
  3. 使用: List<>替换所有CollectionBase派生类

还有其他需要立即更改的吗?

谢谢, ak

6个回答

8

我认为不应该立即采取任何行动!1.1版本的代码是可用的,对吧?全面转向泛型的商业案例在哪里?在2.0下编译应用程序,使其运行并经过测试。然后,当需要新功能以充分利用泛型时,将这些功能实现为泛型。


阅读问题时,这就是我所思考的。如果没有必要,请不要更改任何内容。当您开始编写新代码时,请开始使用泛型;或者如果您正在对现有代码进行更改,则切换到泛型。但不要试图一次性更改所有内容。 - Kibbee

7

还有其他需要立即完成的吗?

通常情况下,尽可能将任何提到 IEnumerable 的内容更改为 IEnumerable<T>。可以通过切换整个命名空间来大大帮助迁移,即在每个文件中取消导入 System.Collections 并改为导入 System.Collections.Generic

此外,搜索代码中提到 object 和/或使用装箱的地方,并考虑这是否仍然合适或应该替换为泛型。

正如jalf 在评论中提醒我的那样,另一个重要的更改是在适用的情况下切换到 IComparable 的通用版本。


同样地,IComparable与IComparable<T>。 - jalf

3

由于其表现力,通常更喜欢使用通用集合。但需要注意的是,如果从非通用集合进行更改,则有时行为可能与您预期的不同。例如,在哈希表(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
}

这个只会在运行时显示,所以提前了解是值得的。


2

0
我不建议使用 List<T> 替代 CollectionBase。相反,Collection<T> 给你可比较的重写。

0

除非您已经拥有一套具有良好代码覆盖率的单元测试套件,否则不要无谓地更改任何内容。

否则,您只是在自找麻烦,更不用说发明了一些无意义的工作...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接