Я нахожусь в проекте ASP.Net 2.0, на С#. У меня есть некоторые данные, которые хранятся в состоянии сеанса. Для удобства использования он завернут в свойство, например:
protected IList<Stuff> RelevantSessionData
{
get
{
return (IList<Stuff>) Session["relevant_key"];
}
set
{
Session["relevant_key"] = value;
}
}
Получение и настройка значения работает точно так, как вы ожидали. Если я хочу очистить значение, я просто установил его равным null, и проблем нет. Однако на другой странице разработчика он вызывает метод Clear() коллекции. Я думал, что это будет ошибкой, но, похоже, это работает, и я не понимаю, почему. Он работает так:
Debug.WriteLine(RelevantSessionData.Count); //outputs, say, 3
RelevantSessionData.Clear();
Debug.WriteLine(RelevantSessionData.Count); //outputs 0
Почему это работает? Мое наивное ожидание было бы в том, что средняя линия загружает сериализованное значение из сеанса, десериализуется в объект, вызывает Clear()
на этом объекте, а затем позволяет безымянному объекту выпасть из области видимости. Это будет ошибкой, потому что значение, хранящееся в сеансе, останется неизменным. Но, по-видимому, он достаточно умен, чтобы вместо этого вызвать средство настройки свойств и сериализовать вновь измененную коллекцию обратно в сеанс.
Это меня немного нервничает, потому что в нашем устаревшем коде есть места, где у разработчиков свойств есть побочные эффекты, и я не хочу, чтобы их вызывали, если они не были предназначены.
Всегда ли вызывающий атрибут свойства вызывается в такой ситуации? Что-то еще происходит? Или я совершенно неправильно понимаю, что здесь происходит?
[Добавлено для объяснения ответа]
Оказывается, неправильно поняли. Я знал, что объекты, хранящиеся в сеансе, должны быть сериализуемыми, и на основании этого я сделал слишком много предположений о том, как коллекция ведет себя внутренне. Я переусердствовал.
Существует только один экземпляр хранимого объекта (my IList
). Каждый вызов получателю возвращает ссылку на тот же самый экземпляр. Таким образом, приведенный выше код работает так же, как кажется, без специальной магии.
И ответить на вопрос заголовка: Нет, сеттеры не называются неявно.