使用YIELD是一种只读方式来返回一个集合吗?

Eri*_*tas 1 .net c# properties yield-keyword

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

private List<string> _mylist;
public IEnumerable<string> MyList
{
get
    {
        return this._mylist;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这并不妨碍用户将IEnumerable转换回List并对其进行修改.

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

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

Ree*_*sey 5

这是一种合理的方法,可以防止您的类的用户返回到List并访问成员.另一种选择是使用_mylist.AsReadOnly(),返回一个ReadOnlyCollection<T>.

但是,我建议不要担心用户如何通过转换为其他内部类型来"破解"您的API.如果您使用公共API IEnumerable<T>,这是最终用户将(或应该)使用的 - 而不是尝试强制转换为List<T>.试图阻止用户做一些不合适的事情并破坏你的API这样做最多是有问题的,特别是因为你不能阻止所有不适当的用法.