Как я создаю неизменный Класс?

108
задан usefulBee 26 June 2017 в 19:50
поделиться

6 ответов

Я думаю, что Вы на правильном пути -

  • , вся информация, введенная в класс, должна быть предоставлена в конструкторе
  • , все свойства должны быть методами get [только 113]
  • , если набор (или Массив) передается в конструктора, это должно быть скопировано, чтобы помешать вызывающей стороне изменить его позже
  • , если Вы собираетесь возвратить свой набор, или возвратить копию или версию только для чтения (например, с помощью ArrayList. ReadOnly или подобный - можно объединить это с предыдущей точкой и хранилище копия только для чтения, которая будет возвращена, когда вызывающие стороны получают доступ к нему), возвратите перечислитель или используйте некоторый другой метод/свойство, который позволяет доступ только для чтения в набор
  • , имеют в виду, что у Вас все еще может быть появление изменяемого класса, если какой-либо из Ваших участников изменяем - если это верно, необходимо скопировать далеко безотносительно состояния Вы захотите сохранить и постараться не возвращать все изменяемые объекты, если Вы не скопируете их перед возвращением их вызывающей стороне - другая опция состоит в том, чтобы возвратить только неизменные "разделы" изменяемого объекта - благодаря @Brian Rasmussen для поощрения меня развернуть эту точку
117
ответ дан Blair Conrad 24 November 2019 в 03:33
поделиться

Чтобы быть неизменными, все Ваши свойства и поля должны быть только для чтения. И объекты в любом списке должны самостоятельно быть неизменными.

можно сделать свойство списка только для чтения следующим образом:

public class MyClass
{
    public MyClass(..., IList<MyType> items)
    {
        ...
        _myReadOnlyList = new List<MyType>(items).AsReadOnly();
    }

    public IList<MyType> MyReadOnlyList
    {
        get { return _myReadOnlyList; }
    }
    private IList<MyType> _myReadOnlyList

}
17
ответ дан Joe 24 November 2019 в 03:33
поделиться

Кроме того, имейте в виду что:

public readonly object[] MyObjects;

не неизменно, даже если это отмечено с ключевым словом только для чтения. Можно все еще изменить ссылки/значения отдельного массива индексным средством доступа.

11
ответ дан lubos hasko 24 November 2019 в 03:33
поделиться

Используйте ReadOnlyCollection класс. Это расположено в System.Collections.ObjectModel пространство имен.

На чем-либо, что возвращает Ваш список (или в конструкторе), устанавливает список как набор только для чтения.

using System.Collections.ObjectModel;

...

public MyClass(..., List<ListItemType> theList, ...)
{
    ...
    this.myListItemCollection= theList.AsReadOnly();
    ...
}

public ReadOnlyCollection<ListItemType> ListItems
{
     get { return this.myListItemCollection; }
}
4
ответ дан mbillard 24 November 2019 в 03:33
поделиться

Другая опция состояла бы в том, чтобы использовать шаблон "посетитель" вместо того, чтобы представить любые внутренние наборы вообще.

1
ответ дан Andrew 24 November 2019 в 03:33
поделиться

Используя ReadOnlyCollection ограничит клиент в изменении его.

0
ответ дан 24 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: