在返回IEnumerable<T>的方法中返回List<T>的相关技术疑问
关于返回IEnumerable但实际返回List的疑问解答
首先纠正一个表述细节:List<string>并不是继承自IEnumerable<string>,而是实现了IEnumerable<string>接口(C#中类与接口的关系是实现,类与类之间才是继承),不过你的写法确实合法,因为接口类型可以持有实现它的类的实例。
你的示例代码:
public IEnumerable<string> GetList() { var list = new List<string>() { "1", "2" }; return list; }
当执行var returnList = GetList();时,returnList的编译时类型是IEnumerable<string>,但运行时实际指向的对象仍然是List<string>实例。
针对你的两个疑问:
方法返回List时,该值是否会被转换为IEnumerable类型?
不会发生对象转换,只是做了隐式的引用类型转换——简单说就是把原本指向List<string>的引用,当作IEnumerable<string>类型来使用。运行时里这个对象本身还是List<string>,没有任何结构或内容的变化。若存在转换操作,是否会像调用ToList()那样降低程序运行速度?
完全不会。ToList()方法会创建一个全新的List<T>实例,并把原集合的元素复制进去,这会带来内存分配和元素拷贝的开销;而这里的隐式引用转换只是编译层面的类型标记,运行时没有任何额外的计算或内存操作,几乎无性能损耗。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

