Witam!
Niedawno natknąłem się na zapętlenie obsługi get
dla jednej z właściwości.
Właściwości rozumiałem dotychczas tak, że teraz zamiast pisania osobnych metod:
class Entity
{
public int GetValue() { return value; }
public void SetValue(int value) { this.value = value; }
private int value;
}
mogę napisać po prostu:
class Entity
{
public int Value
{
get { return Value; }
set { Value = value; }
}
}
I jest to czyste, fajne, proste i intuicyjne.
Niestety takie rozwiązanie powoduje, że dowolne wywołanie
Entity entity = new Entity();
entity.Value = 1;
zapetli wywołanie set
i skończy się przepełnieniem stosu.
Dlaczego tak się dzieje jest oczywiste: przypisanie woła set
, w którym mamy znów set
i rekurencja bez wyjścia.
Żeby uniknąć takiego rozwiązania implementujemy to więc tak:
class Entity
{
public int Value
{
get { return _Value; }
set { _Value = value; }
}
private int _Value;
}
i chociaż problemu zapętlenia teraz nie ma, to jednak właśnie tutaj dochodzimy do mojego pytania:
Czy naprawdę właśnie tak trzeba to implementować?
Moim zdaniem takie rozwiązanie jest już mniej czytelne, niż pisanie własnych GetValue()
. Mając _Value
i Value
kod staje się raczej mniej czytelny, może bardziej podatny na błędy (przynajmniej we wnętrzu klasy).
Najwidoczniej czegoś nie widzę lub nie rozumiem. Jak więc podejść do pisania { get; set; }
? Jak to rozwiązać, jakie są praktyki by stosowanie właściwości było wygodne i czytelne?
public int Value{get { return Value; }set { Value = value; }}
, bo w Setterze używa Settera.