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