为啥List没有IList的IsReadOnly属性
为什么List<T>没有IList<T>的IsReadOnly属性?
类实现了接口,就要实现接口中所有的方法和属性.
那为什么List<T>没有IList<T>的IsReadOnly属性?
另外,这个IsReadOnly属性只有get,不能set.那个IsReadOnly属性有什么用?它将用永远是false
或者说,IsReadOnly属性什么情况下改变?
------解决思路----------------------
什么List<T>没有IList<T>的IsReadOnly属性?
List<T>显式实现了IsReadOnly,因此,你要转化为接口后再调用。
第二个问题,你可以自己实现 IList<T>,就可以完全控制IsReadOnly。某些类库的集合类也有IsReadOnly为真的例子,比如:
------解决思路----------------------
IsReadOnly是被显式实现的,通过List<>变量无法访问。这是语法上最表面的原因。
List<>实现了接口ICollection<>和IList<>,而它们都有IsReadOnly,不得不显示实现。【****没有删除线系列:其实IList继承自ICollection,不存在此问题】
IsReadOnly属于那种“根本不是给最终用户使用”的属性,因为当你用List时,你一定已经知道它就是可读写的,根本用不到这个属性
那谁会用这个属性呢,比如这个场景:你要做一个表格控件,你不但支持绑定List<>还支持绑定数组或者其他实现了ICollection的属性,那就有用了。你可以要求最终用户绑定一个IList给你,你不需要知道它到底是List还是什么,直接读IsReadOnly就能知道你该不该允许最终用户编辑表格内容了
------解决思路----------------------
话说,所谓最终用户,是使用软件的人,而不是编写软件的人
他们面对的就是各种控件,而不是后台的数据
他们不知道你后台用什么结构来存放数据,也不去关心
只有控件的ReadOnly属性对他们来说是有用的,比如一个表格里哪些列可以编辑,哪些列不可以编辑,一个文本框什么时候可以编辑,什么时候只能看...等等
------解决思路----------------------
IsReadOnly 是 IColection<T> 定义的属性。
List<T> 本身有这个属性,但是这根本不是IList<T>定义的,而是ICollection<T>定义的。另外,这个 IsReadonly 被 List<T> 定义为 private 的了,因此开发工具不会给你在显示属性提示。
要注意,首先,这个 IsReadonly 根本不是 IList<T> 定义的。 List<T> 虽然使用了 ICollection<T>,但是接口(使用给class时)并不具有继承性,所以单凭 List<T>使用了 IList<T>,你不能说 List<T>对外需要暴露一个 IsReadOnly 属性。因为 IList<T>本身根本没有这个属性。
接下来,List<T> 额外地又使用了接口 ICollecction<T>,这才给 List<T> 规定了要有 IsReadonly 属性。而不是 IList<T> 给它规定的接口属性。
最后,List<T>不想让vs开发环境感知到这个属性,因为这个属性永远返回false值(永远没有实际作用,只是摆设),所以定义它为 private 的属性。
类实现了接口,就要实现接口中所有的方法和属性.
那为什么List<T>没有IList<T>的IsReadOnly属性?
另外,这个IsReadOnly属性只有get,不能set.那个IsReadOnly属性有什么用?它将用永远是false
或者说,IsReadOnly属性什么情况下改变?
------解决思路----------------------
什么List<T>没有IList<T>的IsReadOnly属性?
List<T>显式实现了IsReadOnly,因此,你要转化为接口后再调用。
List<int> list = new List<int>();
bool isReadOnly = (list as IList<int>).IsReadOnly; // false
第二个问题,你可以自己实现 IList<T>,就可以完全控制IsReadOnly。某些类库的集合类也有IsReadOnly为真的例子,比如:
System.Collections.ObjectModel.ReadOnlyCollection<int> rc = new ReadOnlyCollection<int>(list);
IList<int> irc = rc as IList<int>;
bool readOnly = irc.IsReadOnly; // true
------解决思路----------------------
IsReadOnly是被显式实现的,通过List<>变量无法访问。这是语法上最表面的原因。
List<>实现了接口ICollection<>和IList<>,而它们都有IsReadOnly,不得不显示实现。【****没有删除线系列:其实IList继承自ICollection,不存在此问题】
IsReadOnly属于那种“根本不是给最终用户使用”的属性,因为当你用List时,你一定已经知道它就是可读写的,根本用不到这个属性
那谁会用这个属性呢,比如这个场景:你要做一个表格控件,你不但支持绑定List<>还支持绑定数组或者其他实现了ICollection的属性,那就有用了。你可以要求最终用户绑定一个IList给你,你不需要知道它到底是List还是什么,直接读IsReadOnly就能知道你该不该允许最终用户编辑表格内容了
------解决思路----------------------
话说,所谓最终用户,是使用软件的人,而不是编写软件的人
他们面对的就是各种控件,而不是后台的数据
他们不知道你后台用什么结构来存放数据,也不去关心
只有控件的ReadOnly属性对他们来说是有用的,比如一个表格里哪些列可以编辑,哪些列不可以编辑,一个文本框什么时候可以编辑,什么时候只能看...等等
------解决思路----------------------
IsReadOnly 是 IColection<T> 定义的属性。
List<T> 本身有这个属性,但是这根本不是IList<T>定义的,而是ICollection<T>定义的。另外,这个 IsReadonly 被 List<T> 定义为 private 的了,因此开发工具不会给你在显示属性提示。
要注意,首先,这个 IsReadonly 根本不是 IList<T> 定义的。 List<T> 虽然使用了 ICollection<T>,但是接口(使用给class时)并不具有继承性,所以单凭 List<T>使用了 IList<T>,你不能说 List<T>对外需要暴露一个 IsReadOnly 属性。因为 IList<T>本身根本没有这个属性。
接下来,List<T> 额外地又使用了接口 ICollecction<T>,这才给 List<T> 规定了要有 IsReadonly 属性。而不是 IList<T> 给它规定的接口属性。
最后,List<T>不想让vs开发环境感知到这个属性,因为这个属性永远返回false值(永远没有实际作用,只是摆设),所以定义它为 private 的属性。