Skip to main content
 首页 » 编程设计

c#之使用 YIELD 是返回集合的只读方式吗

2024年01月13日36java哥

我正在编写一个接口(interface),它有一个我希望只读的集合属性。我不希望界面的用户能够修改集合。我发现创建只读集合属性的典型建议是将属性的类型设置为 IEnumerable,如下所示:

private List<string> _mylist; 
public IEnumerable<string> MyList 
{ 
get 
    { 
        return this._mylist; 
    } 
} 

但这并不妨碍用户将 IEnumerable 转换回 List 并对其进行修改。

如果我使用 Yield 关键字而不是直接返回 _mylist,这会阻止我的界面用户修改集合。我认为是这样,因为那时我只是一个一个地返回对象,而不是实际的集合。

 private List<string> _mylist; 
public IEnumerable<string> MyList 
{ 
get 
    { 
        foreach(string str in this._mylist) 
        { 
            yield return str; 
        } 
    } 
} 

请您参考如下方法:

这是防止您的类的用户转换回列表和访问成员的合理方法。另一种选择是使用 _mylist。 AsReadOnly() ,它返回一个 ReadOnlyCollection<T> .

但是,我建议不要担心用户如何通过转换为其他内部类型来“破坏”您的 API。如果您放置一个 IEnumerable<T> 的公共(public) API ,这是最终用户将(或应该)使用的 - 而不是试图转换为 List<T> .试图阻止用户做不当的事情并像这样破坏您的 API 充其量是有问题的,尤其是因为您无法阻止所有不当使用。