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)
这是一种合理的方法,可以防止您的类的用户返回到List并访问成员.另一种选择是使用_mylist.AsReadOnly(),返回一个ReadOnlyCollection<T>
.
但是,我建议不要担心用户如何通过转换为其他内部类型来"破解"您的API.如果您使用公共API IEnumerable<T>
,这是最终用户将(或应该)使用的 - 而不是尝试强制转换为List<T>
.试图阻止用户做一些不合适的事情并破坏你的API这样做最多是有问题的,特别是因为你不能阻止所有不适当的用法.
归档时间: |
|
查看次数: |
645 次 |
最近记录: |