Jestem na projekcie ASP.Net 2.0, w języku C#. Mam niektóre dane, które zostaną zapisane w stanie sesji. Dla ułatwienia użytkowania jest on zawijany w następujący sposób:Czy ustawiacze właściwości .Net są kiedykolwiek wywoływane niejawnie?
protected IList<Stuff> RelevantSessionData
{
get
{
return (IList<Stuff>) Session["relevant_key"];
}
set
{
Session["relevant_key"] = value;
}
}
Uzyskiwanie i ustawianie wartości działa dokładnie tak, jak można się spodziewać. Jeśli chcę wyczyścić wartość, po prostu ustawię ją na wartość null i nie ma problemów. Jednak na innej stronie programisty wywołuje metodę Clear() kolekcji. Myślałem, że to będzie błąd, ale wygląda na to, że działa i nie rozumiem dlaczego. Działa to tak:
Debug.WriteLine(RelevantSessionData.Count); //outputs, say, 3
RelevantSessionData.Clear();
Debug.WriteLine(RelevantSessionData.Count); //outputs 0
Dlaczego to działa? Moje naiwne oczekiwania polegałyby na tym, że środkowa linia ładuje serializowaną wartość z sesji, deserializuje się na obiekt, wywołuje Clear()
na tym obiekcie, a następnie pozwala, aby nienazwany obiekt wypadł poza zasięg. Byłby to błąd, ponieważ wartość przechowywana w sesji pozostanie niezmieniona. Ale najwyraźniej jest wystarczająco inteligentny, aby wywołać funkcję ustawiania właściwości i ponownie przekształcić nowo zmienioną kolekcję z powrotem w sesję.
To mnie trochę denerwuje, ponieważ są miejsca w naszym starodawnym kodzie, w których seter nieruchomości ma efekty uboczne, i nie chcę, żeby ktoś dzwonił, jeśli nie jest przeznaczony.
Czy funkcja ustawiania właściwości jest zawsze wywoływana w takiej sytuacji? Czy coś się dzieje? Czy też zupełnie nie rozumiem, co się tutaj dzieje?
[Dodano wyjaśnienie odpowiedzi]
Okazuje się, że źle zrozumiałam. Wiedziałem, że obiekty przechowywane w Session muszą być przekształcalne do postaci szeregowej, i na tej podstawie stworzyłem zbyt wiele założeń dotyczących sposobu, w jaki kolekcja zachowuje się wewnętrznie. Zastanawiałem się.
Istnieje tylko jedno wystąpienie przechowywanego obiektu (mój IList
). Każde wywołanie gettera zwraca odwołanie do tej samej instancji. Tak więc cytowany powyżej kod działa tak, jak się wydaje, bez specjalnej magii.
Aby odpowiedzieć na pytanie tytułowe: Nie, setery nie są wywoływane domyślnie.
Aha! Przyjąłem, że ponieważ wartości w Session muszą być serializowalne, będą przechowywane w stanie szeregowym, a każde pobranie zwróci inne odwołanie. Jeśli tak nie jest i jest na tyle sprytny, aby zwracać to samo odwołanie w wielu rozmowach, to po prostu przemilczałem to. – Auraseer