勇哥注:
我们知道C#的集合有两类
普通集合
泛型集合
前者存在于 System.Collections 命名空间下,属类型不安全的,后者存在于 System.Collections.Generic 命名空间下,属类型安全的。
不可变对象也就是本文说的只读对象, 定义为一旦创建就不可变更的对象, 在 .NET Core 中就存在着这三大不可变集合
IReadOnlyList
IReadOnlyDictionary
IReadOnlyCollection
简单示例:
internal ReadOnlyCollection<ButtonItem> buttonItems { get { return _buttonItems.AsReadOnly(); } } private List<ButtonItem> _buttonItems = new List<ButtonItem>();
其中ReadOnlyCollection就是泛型只读集合的基类,它的原型如下:
// // 摘要: // 提供泛型只读集合的基类。 // // 类型参数: // T: // 集合中的元素类型。 [ComVisible(false)] [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(Generic.Mscorlib_CollectionDebugView<>))] [DefaultMember("Item")] public class ReadOnlyCollection<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
可以看到,它即继承接口IReadOnlyList,还继承接口IReadOnlyCollection
在真正的项目实践中,有时为了数据安全,我们经常要对集合做一些限制,如只能对集合里面的内容进行读取,但不能修改,
这时我们可有使用ReadOnlyCollection<T>来对集合做一些限制,例如:
public class Lottery { List<int> _numbers = null; public Lottery() { _numbers = new List<int>(5); _numbers.Add(10); _numbers.Add(21); _numbers.Add(32); _numbers.Add(46); _numbers.Add(51); } public ReadOnlyCollection<int> Results { get { return new ReadOnlyCollection<int>(_numbers); } } } static void Main(string[] args) { Lottery ttery = new Lottery(); foreach (int list in ttery.Results) { Console.WriteLine(list); } ttery.Results[0] = 1;//这行代码在编译器里面会提示错误,因为Results是只读的 }
当然,上述我们讲的都是list,那ReadOnlyCollection<int>也同样适用于数组,如下:
int [] items = new int[3]; items[0]=0; items[1]=1; items[2]=2; new ReadOnlyCollection<int>(items);
注:在使用时,需要添加using System.Collections.ObjectModel 这个引用。

