Код в разделе (set) не выполняется, отладчик не останавливается в наборе при установке точки останова.
Похоже, ваш вопрос: "почему метод доступа set
не вызывается, когда я это делаю: t.id.Add("one");
"
Причина заключается в том, что метод доступа set
предназначен для самого List
.Ваш код не устанавливает t.id
для нового List<string>
, скорее он вызывает метод .Add
объекта, возвращаемого из свойства t.id
.
Таким образом, выполнение будет выглядеть примерно так:
- Метод доступа
get
вызывается, когда вы делаете t.id
, и он возвращает экземпляр _id
- Затем вызывается метод
.Add
_id
,и строка "one"
добавляется в приватное поле поддержки _id
Обратите внимание, что в существующем коде set
действительно вызывается из конструктора, когдавы явно устанавливаете id
в новый список.
Вы заявили, что ваша цель "изменить некоторые другие свойства, когда я добавляю элемент в id" .Есть несколько способов сделать это, но, вероятно, самый простой для понимания и реализации:
- В аксессоре для списка
get
верните копию списка.Это не позволяет клиентам добавлять элемент напрямую с помощью метода Add
.Также обратите внимание, что нет необходимости в set
аксессоре. - Предоставьте отдельный метод
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");