c# – ReadonlyCollection,对象是不可变的吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – ReadonlyCollection,对象是不可变的吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1474字,纯文字阅读大概需要3分钟。
内容图文
![c# – ReadonlyCollection,对象是不可变的吗?](/upload/InfoBanner/zyjiaocheng/757/42fd48cf38804ccb9421b864de4d8fef.jpg)
我正在尝试使用ReadOnlyCollection使对象不可变,我希望对象的属性是不可变的.
public ReadOnlyCollection<FooObject> MyReadOnlyList
{
get
{
return new ReadOnlyCollection<FooObject>(_myDataList);
}
}
但我有点困惑.
我试图使用foreach将对象的属性更改为MyReadOnlyList并且…我可以更改value属性,是否正确?我理解ReadOnlyCollection设置一个添加级别,使对象不可变.
解决方法:
ReadOnlyCollection是不可变的这一事实意味着无法修改集合,即无法从集合中添加或删除任何对象.这并不意味着它包含的对象是不可变的.
0740 by Eric Lippert,解释了不同类型的不变性是如何工作的.基本上,ReadOnlyCollection是一个不可变的外观,它可以读取底层集合(_myDataList),但不能修改它.但是,您仍然可以更改基础集合,因为您通过执行_myDataList [0] = null之类的操作来引用_myDataList.
此外,ReadOnlyCollection返回的对象与_myDataList返回的对象相同,即this._myDataList.First()== this.MyReadOnlyList.First()(使用LINQ).这意味着如果_myDataList中的对象是可变的,那么MyReadOnlyList中的对象也是如此.
如果您希望对象是不可变的,则应相应地设计它们.例如,您可以使用:
public struct Point
{
public Point(int x, int y)
{
this.X = x;
this.Y = y;
}
// In C#6, the "private set;" can be removed
public int X { get; private set; }
public int Y { get; private set; }
}
代替:
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
}
编辑:在这种情况下,如Ian Goldby所述,两个struct都不允许您修改集合中元素的属性.发生这种情况是因为结构是值类型,当您访问元素时,集合会返回值的副本.如果它是一个类,则只能修改Point类型的属性,这意味着返回对实际对象的引用,而不是它们的值的副本.
内容总结
以上是互联网集市为您收集整理的c# – ReadonlyCollection,对象是不可变的吗?全部内容,希望文章能够帮你解决c# – ReadonlyCollection,对象是不可变的吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。