我有一个名为GestorePersonale
的类,它包含另一个类的实例列表:
public List<Dipendente> Dipendenti { get; private set; }
我希望这个列表只能从类暴露的方法中修改,而不是直接修改。我注意到,使用上面的代码,可以做到
var gp = new GestorePersonale(); gp.Dipendenti.Add( new Dipendente( ... ) );并且能够对
List<Dipendente>
本身执行任何其他类型的操作。
我考虑过将第一个代码段转换为
private List dipendenti;
但我可以找到一些缺点:
解决这种情况的最佳方法是什么?
答案 0 :(得分:6)
您可以将列表包装在ReadOnlyCollection<T>中并公开:
private List<Dipendente> dipendenti;
private ReadOnlyCollection<Dipendente> readOnlyDipendenti;
public GestorePersonale()
{
dipendenti = new List<Dipendente>();
readOnlyDipendenti = new ReadOnlyCollection<Dipendente>(dipendenti);
}
public ReadOnlyCollection<Dipendente> Dipendenti
{
get { return readOnlyDipendenti; }
}
在内部,您可以访问dipendenti
并可以添加/删除项目。外部实体只能访问ReadOnlyCollection&lt; T&gt;。包装列表,因此他们只能读取,但不能添加/删除项目。
答案 1 :(得分:3)
我同意dtb,ReadOnlyCollections是要走的路。但是,您可以从属性getter(使用AsReadOnly)返回它并删除该方法。
private List<Dipendente> dipendenti = new List<Dipendente>();
public ReadOnlyCollection<Dipendente> ReadOnlyDipendenti
{
get
{
return dipendenti.AsReadOnly();
}
}
答案 2 :(得分:2)
你可以做几件事:
ReadOnlyCollection
IEnumerable<_type>
您使用的方法取决于您需要的功能以及您希望/需要向您的班级用户公开的内容
答案 3 :(得分:0)
您拥有的是拥有私人访客的公共财产。这非常有用。它允许实例公开由实例本身控制(设置)的值,例如,一个州。
例如,使用Count属性获取集合。它有一个公共访问器是没有意义的。实现可以是在更改集合时更新属性(内部)(以避免每次都计算它)。
答案 4 :(得分:0)
执行setter方法或将该字段包装在另一个类中。这是一个经典的集合集和collection.add问题。