C# - 接口 - 类型初始化

时间:2009-08-22 09:26:20

标签: c#

考虑一下这个例子:

IList<string> _lstColl = new[] { "Alex", "Sam", "Gates", "Riaz" };

我可以初始化它 为:

string[] _stringBag =   new[] { "Alex", "Sam", "Gates", "Riaz" };

在这里使用界面有什么好处?

4 个答案:

答案 0 :(得分:5)

优点是它向读者表明你没有使用它碰巧是一个数组的事实。我倾向于将局部变量声明为包含我需要的所有功能的最常规类型。例如,我会这样做:

using (TextReader reader = File.OpenText(...))

而不是指定StreamReader

很少非常重要,但确实可以更轻松地更改实施细节。例如,假设我们想要更改您的示例以使用List<T>而不是数组。

你可以改变这个:

IList<string> _lstColl = new[] { "Alex", "Sam", "Gates", "Riaz" };

到此:

IList<string> _lstColl = new List<string> { "Alex", "Sam", "Gates", "Riaz" };

并且知道它仍然会编译。一些语义可能不一样,所以你仍然需要小心 - 但至少你知道它不会使用任何特定于数组的方法。

答案 1 :(得分:2)

这是generics的示例,您正在使用字符串数据类型创建IList。

  

泛型介绍.NET   框架类型的概念   参数,使其成为可能   设计类和推迟的方法   一种或多种类型的规范   直到声明类或方法   并由客户端代码实例化。对于   例如,通过使用泛型类型   参数T你可以写一个   其他客户端代码可以使用的类   不会产生成本或风险   运行时强制转换或装箱操作。

在这里阅读更多内容

What is cool about generics, why use them?

Do C# Generics Have a Perfomance Benefit?

答案 2 :(得分:2)

没有优点或缺点。如果您的代码需要IList,那么请给它一个。如果你的代码需要一个数组,那就给它一个。

答案 3 :(得分:1)

我真的不明白数组实现IList的原因。当您调用Add时,它会抛出异常。 数组没有IList语义,因为它不可调整大小。这就是为什么我避免将数组作为IList 。如果我需要一个列表,我会这样写:

IList<string> _lstColl = new List<string>() { "Alex", "Sam", "Gates", "Riaz" };

(PS:使用标准框架的集合接口存在很多问题,比如缺少方法甚至缺少接口。当你使用集合接口时,像往常一样使用NHibernate时,你会认识到它们有时候设计得很糟糕。我认为这个接口的开发人员似乎没有使用它们。只是我的观点。)