为何Array没有AsReadOnly实例方法,而List却具备该方法?
这确实是个有意思的细节——List和Array在创建只读集合的方式上存在明显差异,咱们来拆解一下:
List 的 AsReadOnly() 实例方法
ListAsReadOnly(),用法非常直观:
var list = new List<int>(); var readOnlyList = list.AsReadOnly();
它的实现逻辑很简单,就是把当前List实例包装成ReadOnlyCollection
public ReadOnlyCollection<T> AsReadOnly() { return new ReadOnlyCollection<T>((IList<T>) this); }
Array 的 AsReadOnly<T>() 静态方法
反观数组(Array),它并没有对应的实例方法,只能通过静态方法 Array.AsReadOnly<T>() 来创建只读包装:
var array = new int[] { }; var readOnlyArray = Array.AsReadOnly(array);
它的实现思路和List版本类似,但额外增加了null检查逻辑:
public static ReadOnlyCollection<T> AsReadOnly<T>(T[] array) { if (array == null) throw new ArgumentNullException(nameof(array)); return new ReadOnlyCollection<T>(array); }
简单来说,List作为专门设计的集合类,把创建只读视图的逻辑封装成了实例方法;而数组是CLR层面的特殊类型,只能通过静态方法提供这个能力。
内容的提问来源于stack exchange,提问作者Backs
相关产品推荐
相关产品推荐

