C#中声明集合时为何使用IList接口而非直接使用List实现类?
关于C#中用
IList<T>和List<T>声明变量的区别解答 两者功能是否完全一致?
不完全一致,核心差异在编译期的成员可访问范围,运行时底层逻辑没有区别:
- 两种写法创建的都是
List<string>类型的实例,运行时执行IList<T>定义的核心方法(比如Add、Remove、索引取值赋值等)时,执行逻辑完全相同 - 用
List<T>声明的变量可以直接调用List<T>独有的方法,比如AddRange、Sort、FindAll、AsReadOnly等;但用IList<T>声明的变量只能调用接口定义的成员,直接调用List<T>独有方法会触发编译报错,除非显式强转为List<T>类型
不需要自定义列表的场景下,为什么还要用IList<T>声明?
这是面向对象「面向接口编程」的常规实践,核心价值是降低代码耦合度,提升可维护性:
- 后续替换实现成本极低:如果后续需求变化,需要把底层实现从
List<T>换成其他实现了IList<T>的类(比如Collection<T>、ObservableCollection<T>或者自定义列表类),只需要修改new后面的实现类即可,所有用到该变量的业务代码不需要做任何调整 - 明确调用范围约束:用接口声明相当于给后续维护代码的人传递明确信号:这段逻辑只用到通用列表的核心能力,不需要依赖
List<T>的独有特性,避免有人随意引入List<T>独有的方法,导致后续替换实现时需要修改大量业务代码 - 适配通用方法返回值:多数通用框架的公共方法、第三方库的列表返回值都会用接口类型而非具体实现类定义,用
IList<T>接收返回值不需要额外做类型转换,适配性更强
当然如果你的业务逻辑明确需要用到List<T>的独有方法,直接用List<T>声明变量即可,没必要强行使用接口增加不必要的强转成本。
内容的提问来源于stack exchange,提问作者Mephobia
相关产品推荐
相关产品推荐

