Как установить свойство списка? - PullRequest
0 голосов
/ 15 июня 2019

Я не уверен, но, кажется, я не могу установить свойство списка? Код в разделе (set) не выполняется, отладчик не останавливается в наборе при установке точки останова.

если свойство списка обрабатывается по-другому? и если есть ссылка какого-то чтения на эту тему.

    class test
    {
        public test()
        {
            id = new List<string>();
            _id = new List<string>();
        }
        private List<string> _id;

        public List<string> id
        {
            get { return _id; }
            set
            {
                _id = value;
            }
        }
    }
test t = new test();
t.id.Add("one");

1 Ответ

0 голосов
/ 15 июня 2019

Код в разделе (set) не выполняется, отладчик не останавливается в наборе при установке точки останова.

Похоже, ваш вопрос: "почему метод доступа set не вызывается, когда я это делаю: t.id.Add("one");"

Причина заключается в том, что метод доступа set предназначен для самого List.Ваш код не устанавливает t.id для нового List<string>, скорее он вызывает метод .Add объекта, возвращаемого из свойства t.id.

Таким образом, выполнение будет выглядеть примерно так:

  1. Метод доступа get вызывается, когда вы делаете t.id, и он возвращает экземпляр _id
  2. Затем вызывается метод .Add _id,и строка "one" добавляется в приватное поле поддержки _id

Обратите внимание, что в существующем коде set действительно вызывается из конструктора, когдавы явно устанавливаете id в новый список.


Вы заявили, что ваша цель "изменить некоторые другие свойства, когда я добавляю элемент в id" .Есть несколько способов сделать это, но, вероятно, самый простой для понимания и реализации:

  1. В аксессоре для списка get верните копию списка.Это не позволяет клиентам добавлять элемент напрямую с помощью метода Add.Также обратите внимание, что нет необходимости в set аксессоре.
  2. Предоставьте отдельный метод AddId для вашего класса, который клиенты должны будут вызывать для фактического добавления элемента.Здесь у вас есть возможность сделать что-то еще, когда элементы добавляются в список.

Например:

class Test
{ 
    private readonly List<string> id = new List<string>();

    // Return a copy of our private list
    public List<string> Id => id?.ToList();

    public void AddId(string newId)
    {
        id.Add(newId);
        // do something else here when we add a new item
    }
}

Обратите внимание, что это может вызвать некоторую путаницу у клиентовваш класс, потому что они все еще могут делать test.Id.Add("invalid item");, и они не получат никакой ошибки, но это также не добавит ничего в приватный список.Если они хотят что-то добавить в список, им нужно вызвать метод AddId:

t.AddId("one");
...