我正在编写一个接口(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 充其量是有问题的,尤其是因为您无法阻止所有不当使用。
