加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何允许对私有集合进行迭代而不进行修改?

发布时间:2020-12-15 18:35:04 所属栏目:百科 来源:网络整理
导读:如果我有以下班级成员: private Listobject obs; 我希望允许遍历此列表作为类接口的一部分,我该怎么做? 公开它是行不通的,因为我不想直接修改列表. 解决方法 您可以将其公开为IEnumerable T,但不仅仅是直接返回它: public IEnumerableobject Objects { ge
如果我有以下班级成员:
private List<object> obs;

我希望允许遍历此列表作为类接口的一部分,我该怎么做?

公开它是行不通的,因为我不想直接修改列表.

解决方法

您可以将其公开为IEnumerable< T>,但不仅仅是直接返回它:
public IEnumerable<object> Objects { get { return obs.Select(o => o); } }

既然您表示只想要遍历列表,那么这就是您所需要的.

有人可能会想要返回List< object>直接作为IEnumerable< T>,但这是不正确的,因为可以容易地检查IEnumerable< T>在运行时,确定它是List< T>并将其投射到这样并改变内容.

但是,通过使用return obs.Select(o => o);你最终在List< object>上返回一个迭代器,而不是对List< object>的直接引用.本身.

根据C#语言规范的第7.15.2.5节,有些人可能会认为这符合“退化表达式”.但是,Eric Lippert goes into detail as to why this projection isn’t optimized away.

此外,人们建议使用AsEnumerable extension method.这是不正确的,因为保留了原始列表的参考标识.从文档的备注部分:

The AsEnumerable<TSource>(IEnumerable<TSource>) method has no effect other than to change the compile-time type of source from a type that implements IEnumerable<T> to IEnumerable<T> itself.

换句话说,它所做的只是将源参数转换为IEnumerable< T>,这无助于保护参考完整性,返回原始引用并且可以将其转换回List< T>.并用于改变列表.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读