Имеет ли смысл открытое поле с частными средствами доступа? - PullRequest
2 голосов
/ 09 февраля 2012

У меня есть класс с именем GestorePersonale, который содержит список экземпляров другого класса:

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

Я хочу, чтобы этот список можно было изменять только из методов, предоставляемых классом, а не напрямую. Я заметил, что с кодом выше, можно просто сделать

var gp = new GestorePersonale();
gp.Dipendenti.Add( new Dipendente( ... ) );
и иметь возможность выполнять любые другие действия на самом List<Dipendente>.

Я подумал о преобразовании первого фрагмента кода в

private List dipendenti;

но я мог бы найти несколько минусов к этому:

  • Это нарушило бы мое личное правило, чтобы попытаться всегда использовать общедоступные поля над личными изнутри методов класса, когда это возможно (хотя я не уверен, что это хорошая практика, поэтому любые разъяснения приветствуются);
  • Это ухудшит возможность доступа любых внешних объектов к содержимому списка только для чтения , например, для выполнения запроса LINQ над содержимое списка.

Как лучше всего решить эту ситуацию?

Ответы [ 5 ]

6 голосов
/ 09 февраля 2012

Вы можете обернуть список в ReadOnlyCollection и указать, что:

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 , которая охватывает список, поэтому они могут только читать, но не добавлять / удалять элементы.

3 голосов
/ 09 февраля 2012

Я бы согласился с dtb, что ReadOnlyCollections - это путь.Однако вы можете вернуть его из свойства get (используя AsReadOnly) и удалить метод.

    private List<Dipendente> dipendenti = new List<Dipendente>();

    public ReadOnlyCollection<Dipendente> ReadOnlyDipendenti
    {
        get
        {
            return dipendenti.AsReadOnly(); 
        }
    }
2 голосов
/ 09 февраля 2012

есть пара вещей, которые вы можете сделать:

вы используете ReadOnlyCollection Вы можете вернуть IEnumerable<_type> вы можете обернуть список в другом классе вы можете свернуть свой собственный класс коллекции, реализуя соответствующий интерфейс

используемый вами метод зависит от необходимой вам функциональности и того, что вы хотите / нужно предоставить пользователю вашего класса

0 голосов
/ 09 февраля 2012

Сделайте метод установки или оберните поле в другом классе. Это классический набор коллекций и проблема collection.add.

0 голосов
/ 09 февраля 2012

То, что у вас есть, является публичной собственностью с частным доступом. Это очень полезно. Это позволяет экземпляру предоставлять значение, которое контролируется (устанавливается) самим экземпляром, например состояние.

Например, взять коллекцию со свойством Count. Нет смысла в этом иметь публичный доступ. Реализация может состоять в том, чтобы обновлять свойство (внутренне) при изменении коллекции (чтобы избежать необходимости каждый раз считать его).

...