Jakiś czas temu straciłem dwa dni na znalezienie prostego błędu. Został on popełniony całkowicie nieświadomie. Zresztą jak większość błędów. Zachowanie aplikacji było całkiem nietypowe – po otworzeniu program się po prostu zamykał. Pewnie zadajecie sobie pytanie, co w tym nietypowego. Otóż po podpięciu debuggera pod aplikację nie otrzymywaliśmy ani jednej wskazówki, co może być nie tak. Aplikacja po prostu zamykała się, a debugger zostawał odpinany od programu.

Błąd spowodowany został przez drobną literówkę. Otóż okazuje się, że zrobienie niekończącej się rekurencji nie jest w żaden sposób wyłapywane przez kompilator. W moim programie zamiast małej litery pojawiła się duża w deklaracji właściwości klasy:

private string test;

public string Test
{
  get
  {
    return this.Test;
  }

  set
  {
    if (this.test != value)
      {
        this.test = value;
        this.NotifyPropertyChanged(m => m.Test);
      }
    }
  }
}

Zamiast:

return this.test;

pojawiło się:

return this.Test;

Błąd trywialny, którego poprawienie powinno zająć kilka sekund. Problem wystąpił jednak z jego znalezieniem. Do momentu wystąpienia tej sytuacji przyzwyczajony byłem to tego, że w momencie wystąpienia niekończącej się rekurencji pojawiał się zawsze wyjątek mówiący o przepełnieniu stosu. I wiadomo było, czego szukać. A tym czasem błędne miejsce w kodzie znalazłem całkiem przypadkowo.