2009-08-22 110 views
0

考虑例如:C# - 接口 - 型动初始化

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

我可以用来初始化它 为:

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

什么是这里有接口​​的优势是什么?

回答

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" }; 

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

+0

不是C而不是Python! *G – 2009-08-22 09:37:05

2

这是generics的一个示例,您将创建一个字符串数据类型的IList。

泛型引入到.NET 框架的类型 参数概念,这使得有可能设计 类和方法的是推迟 一种或多种类型 直到类或方法的说明书中被声明 并由客户端代码实例化。例如,对于 示例,通过使用参数T的通用类型 ,您可以编写单个 类,其他客户端代码可以使用 而不会产生运行时转换或装箱操作的成本或风险。

更多在这里阅读

What is cool about generics, why use them?

Do C# Generics Have a Perfomance Benefit?

+0

对不起!本来会构思我的问题,更具体。间接初始化接口有什么好处(当然,我们不能为接口创建实例)。 – user160677 2009-08-22 09:36:11

+0

我不认为这个问题真的是关于泛型。 – 2009-08-22 09:42:18

2

有没有优点还是缺点。如果你的代码需要一个IList,那就给它一个。如果你的代码需要一个数组,然后给它一个。

+0

有缺点。看到我的答案。 – 2009-08-22 09:43:22

1

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

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

(PS:有相当多的问题与使用标准架构的集合接口,如缺少方法,甚至缺少的接口当你。正在处理集合接口,像往常一样,例如在使用NHibernate时,你会发现它们有时设计的很糟糕,这个接口的开发人员似乎并没有使用它们,只是我的看法。)

+0

这是因为没有独立的接口,只有索引器和计数。 – 2009-08-22 09:35:54

+1

是的,请参阅我的PS关于收集界面。我对.NET收集设计感到非常失望。我的意思是,这些列表类型和语义自数十年以来就广为人知。为什么他们想出了一个带有如此糟糕收藏品设计的新框架? – 2009-08-22 09:40:04