我习惯将对象实例化如下:
type obj-name = new type();
现在我正在使用
IList<string> str_element = new List<string>();
我期待看到一些东西
IList<string> actors = new IList<string>();
有人可以给我一些想法,为什么界面实例化在这里有所不同?
谢谢,
阿米特
答案 0 :(得分:4)
接口只是 - 接口或应该存在哪些方法的规范 接口不包含任何实际代码。
接口只能用作包含具体类的类型 创建接口实例没有意义,因为没有任何实例化。
答案 1 :(得分:3)
您无法执行= new IList<string>()
的原因是因为IList<T>
是一个接口而您无法初始化接口,因为没有可调用的代码体。我会推荐做
List<string> actors = new List<string>()
代替。
答案 2 :(得分:1)
接口定义实现类必须提供的契约或功能集(至少)。通过定义类型IList<T>
的变量,您实际上是在说,“我不关心实际实现是什么,它只需要提供该功能。”这意味着你正在调用你的调用代码中的'interface'和'implementation',这是一件好事。
接口的真正威力在于您拥有可插拔代码。如果您正在定义库,而不是返回List<T>
实例,则可以返回IList<T>
实例(其中AFAIK是LINQ功能所做的)。这允许您更改返回的对象的内部实现(它可能是链接列表,或B树,或其他),并且调用代码不需要更改。
很多模拟库(例如NMock,Moq等)利用接口并可以生成用于测试目的的实现类。
答案 3 :(得分:0)
您可以使用LINQ:例如
这将为您提供更具体的类型。
using System.Linq;
IList<Foo> list = new List<Foo>();
IEnumerable<Foo> sortedEnum = list.OrderBy(f=>f.Bar);
IList<Foo> sortedList = sortedEnum.ToList()