ObservableCollection为何有List构造函数?.NET 7中是否冗余?
.NET 7中ObservableCollection为何保留List类型的构造函数?
先看你贴出的两个构造函数实现:
public ObservableCollection(IEnumerable<T> collection) : base(new List<T>(collection ?? throw new ArgumentNullException(nameof(collection)))) { } public ObservableCollection(List<T> list) : base(new List<T>(list ?? throw new ArgumentNullException(nameof(list)))) { }
从代码逻辑上看,两者最终都通过List<T>的构造函数初始化内部集合,乍看确实显得冗余,但它的存在主要有两个关键原因:
向后兼容性:这个
List<T>重载的构造函数从.NET Framework时期就存在,大量遗留代码可能直接依赖这个API。如果在.NET 7中移除它,会导致这些代码升级时出现编译错误,违背.NET跨版本兼容的设计原则。微小但存在的性能差异:虽然.NET 7里
List<T>(IEnumerable<T>)会对List<T>类型的输入做优化(识别为ICollection<T>并调用CopyTo),但List<T>(List<T>)的实现更直接——它直接复制内部的数组缓冲区,跳过了类型检查和接口调用的额外开销,在大规模数据初始化的场景下,能带来可感知的性能提升。即使当前差异不明显,保留这个重载也为未来的性能优化预留了空间。
如果仅保留IEnumerable<T>构造函数,功能上完全够用——任何List<T>都可以隐式转换为IEnumerable<T>传入。但从兼容性和潜在性能收益的角度,保留这个重载是更稳妥的设计选择。
内容的提问来源于stack exchange,提问作者Luk164
相关产品推荐
相关产品推荐

