考虑例如:C# - 接口 - 型动初始化
IList<string> _lstColl = new[] { "Alex", "Sam", "Gates", "Riaz" };
我可以用来初始化它 为:
string[] _stringBag = new[] { "Alex", "Sam", "Gates", "Riaz" };
什么是这里有接口的优势是什么?
考虑例如:C# - 接口 - 型动初始化
IList<string> _lstColl = new[] { "Alex", "Sam", "Gates", "Riaz" };
我可以用来初始化它 为:
string[] _stringBag = new[] { "Alex", "Sam", "Gates", "Riaz" };
什么是这里有接口的优势是什么?
好处在于它向读者展示了您没有使用它恰好是数组的事实。我倾向于将局部变量声明为最通用的类型,其中包含我需要的所有功能。例如,我会这样做:
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" };
,并知道它仍然编译。一些语义可能不一样,所以你仍然需要小心 - 但至少你知道它不会使用任何数组特定的方法。
这是generics的一个示例,您将创建一个字符串数据类型的IList。
泛型引入到.NET 框架的类型 参数概念,这使得有可能设计 类和方法的是推迟 一种或多种类型 直到类或方法的说明书中被声明 并由客户端代码实例化。例如,对于 示例,通过使用参数T的通用类型 ,您可以编写单个 类,其他客户端代码可以使用 而不会产生运行时转换或装箱操作的成本或风险。
更多在这里阅读
对不起!本来会构思我的问题,更具体。间接初始化接口有什么好处(当然,我们不能为接口创建实例)。 – user160677 2009-08-22 09:36:11
我不认为这个问题真的是关于泛型。 – 2009-08-22 09:42:18
有没有优点还是缺点。如果你的代码需要一个IList,那就给它一个。如果你的代码需要一个数组,然后给它一个。
有缺点。看到我的答案。 – 2009-08-22 09:43:22
我真的不明白为什么一个数组实现IList。当你调用Add时,它会抛出一个异常。 数组没有IList语义,因为它不可调整大小。这就是为什么我避免有IList阵列。如果我需要一个名单,我会写这样的:
IList<string> _lstColl = new List<string>() { "Alex", "Sam", "Gates", "Riaz" };
(PS:有相当多的问题与使用标准架构的集合接口,如缺少方法,甚至缺少的接口当你。正在处理集合接口,像往常一样,例如在使用NHibernate时,你会发现它们有时设计的很糟糕,这个接口的开发人员似乎并没有使用它们,只是我的看法。)
这是因为没有独立的接口,只有索引器和计数。 – 2009-08-22 09:35:54
是的,请参阅我的PS关于收集界面。我对.NET收集设计感到非常失望。我的意思是,这些列表类型和语义自数十年以来就广为人知。为什么他们想出了一个带有如此糟糕收藏品设计的新框架? – 2009-08-22 09:40:04
不是C而不是Python! *G – 2009-08-22 09:37:05