拥有私人访问者的公共领域是否有意义?

时间:2012-02-08 21:03:29

标签: c# field private readonly public

我有一个名为GestorePersonale的类,它包含另一个类的实例列表:

public List<Dipendente> Dipendenti
{
    get;
    private set;
}

我希望这个列表只能从类暴露的方法中修改,而不是直接修改。我注意到,使用上面的代码,可以做到

var gp = new GestorePersonale();
gp.Dipendenti.Add( new Dipendente( ... ) );
并且能够对List<Dipendente>本身执行任何其他类型的操作。

我考虑过将第一个代码段转换为

private List dipendenti;

但我可以找到一些缺点:

  • 这会破坏我的个人规则,试图在可能的情况下始终使用公共字段而不是类别方法中的私有字段(即使我不确定这样做是否是好的做法,所以任何澄清都是受欢迎的);
  • 这会损害任何外部实体仅为读取目的访问列表内容的能力,例如,执行LINQ查询列表内容。

解决这种情况的最佳方法是什么?

5 个答案:

答案 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问题。