Wywoluje sie getter podczas debugowania

0

Debugowalem sobie kod w celu znalezenia gdzie kolekcja bledow (List<Error> Errors) zostaje zwiekszona.
Gdy w pewnym momencie najezdzalem na obiekt ktory zawieral ta liste, ta lista sie powiekszala (count++ za kazdym najechaniem na obiekt).
Wywnioskowalem, ze to przez to ze ten obiekt posiada property gdzie w getterze jest dodawany wlasnie do tej kolekcji error

Pytanie jest nastepujace

Czy da sie wylaczyc w opcjach by nie wykonywal kodu dynamicznie podczas debuggowania? Ciezko znalezc miejsce gdzie sie kolekcja zwieksza jezeli po najechaniu obiektu ta kolekcja sie zwieksza...

0

Ale jaki sens ma debugowanie bez wykonywania kodu? o.O

2

Nie znam odpowiedzi na pytanie ale imo nie jest to istotne. Getter nie powinien modyfikować stanu obiektu, bo w końcu kiedyś dostaniesz rykoszetem. W zasadzie właśnie masz taki przypadek ;)

EDIT:
Po chwili zastanowienia, to się raczej nie da, bo właściwość w C# to jest cukierek składniowy, pod którym znajdują się dwie funkcje. Jeżeli podglądasz wartość zmiennej, wywoływany jest getter, a więc funkcja. Wydaje mi się, że nie ominiesz tego.

0

Moze zle napisalem

Zatrzymuje sie na linijce powiedzmy 115. W tym momencie nic sie nie wykonuje, nie ma innych watkow. Glowny jest zatrzymany na 115 linii.

Lista powinna miec count == 0.

Najezdzam myszka na obiekt. Count == 0. Najezdzam jeszcze raz na obiekt patrze a count == 1. Za kazdym razem gdy najezdzam na obiekt myszka (a program nadal jest zatrzymany na tej 115 linijce) lista jest powiekszana.

obiekt na ktory najezdzam kursorem posiada getter ktory zwieksza liste. Wystarczy tylko najechac myszka na obiekt zeby zobaczyc jego stan a jego stan sie ZMIENIA... to nie jest normalne

0

Naprawdę Kiepsko napisany kod. Getter który NIE powinien wprowadzać zmian, wprowadza zmiany. Ehh.

Workaround:
Ustaw sobie breakpointa w getterze. Pomiń ręcznie przesuwając strzałeczka zwiększanie się listy błędów, albo usuwaj ręcznie przez immediate window.

Ja generalnie raczej najpierw bym to przepisał jakoś sensownie, o ile da się łatwo, a potem debugował (najpierw prze prosto, nowa metoda GetX, która robi 1:1 to co ten getter, łącznie ze zwiększaniem i zastąpienie gettera w kodzie nią(Shift+F12). Getter byłby teraz tylko do podglądu. Dało by się debugować normalnie. Później przepisałbym to sensowniej).

2

Rozwiązanie problemu jest bardzo proste: skasuj kod, a współpracowników spal zanim zdążą się rozmnożyć

Getter który wywołuje się podczas próby odczytu wartości, setter który się wywołuje przy próbie zapisania wartości... CO DALEJ?! Konstruktor który się wykona przy tworzeniu obiektu?! Szaleństwo

0

@AreQrm

breakpoint nie dziala... moze zapomnialem wspomniec o tym. Kod wykonuje sie "po cichu"

@Wielki Mlot Tak wywolanie sie gettera PODCZAS DEBUGGOWANIA, PODCZAS NAJECHANIE MYSZKA NA OBIEKT to jest WTF. Debugowalem w swoim zyciu troche, ale czegos takiego po prostu nie widzialem nigdy. Dlatego sie zapytalem czy jest mozliwosc wylaczenia tego, bo dla mnie to normalnie nie jest (zachowanie rozumiem, nadal najechanie myszka na obiekt nie powinno zmieniac jego stanu. Dopiero RECZNE wywolanie tego gettera powinno zmienic stan obiektu)

0

To przepisz to i debugging wtedy. :-(

W ogóle nigdy nie sprawdzałem czy podglądanie obiektu jest przez getter properties'a czy odwołuje się bezpośrednio do wartości. Ciekawe rzeczy pokazujesz przez złe napisany kod można się czegoś nauczyć :-P

0

Twoja odpowiedz jest na takiej zasadzie

Ja: "Panowie, jak otwieram maske to wlaczaja mi sie wycieraczki, jak to wylaczyc?"
@AreQrm: "Do d**y jest zaprojektowany ten samochod. Wez przebuduj otwieranie klapy i wycieraczki"

przepisywanie to nie jest rozwiazanie (tym bardziej ze projekt wczoraj zobaczylem po raz pierwszy na oczy). Chcialem sie dowiedziec czy jest mozliwosc wylaczenia tej nieszczesnej opcji

0
fasadin napisał(a):

@Wielki Mlot Tak wywolanie sie gettera PODCZAS DEBUGGOWANIA, PODCZAS NAJECHANIE MYSZKA NA OBIEKT to jest WTF. Debugowalem w swoim zyciu troche, ale czegos takiego po prostu nie widzialem nigdy.

Ależ to jest ułatwienie. W przeciwnym razie nie mielibyśmy podglądu właściwości wcale.

Jeżeli potrzebujemy coś zmieniać przy pobieraniu właściwości, to powinno się robić to metodą. Wtedy sprawa jest bardziej oczywista.

Przy okazji przytoczę dla tych co nie widzieli (ostatni akapit):

http://mcfunley.com/from-the-annals-of-dubious-achievement

4

@Sarrus, @AreQrm - przecież @fasadin 1) napisał że to nie jego kod 2) wie że to jest zły kod 3) nie chce go przepisywać.

Trochę jak zauważył:

Ja: "Panowie, jak otwieram maske to wlaczaja mi sie wycieraczki, jak to wylaczyc?"
@AreQrm: "Do d**y jest zaprojektowany ten samochod. Wez przebuduj otwieranie klapy i wycieraczki"

A na temat - jest kilka rozwiązań:

Detaliczne to dodanie tego atrybutu do problematycznego property:

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

Hurtowe (wyłączenie wszystkich evali) to odznaczenie Tools -> Options -> Debugging -> General -> Allow property evaluation in variables windows (albo Enable property evaluation and other implicit function calls, zależnie od wersji).

Powinno pomóc na automatyczne wykonywanie w każdym razie.

PS. Współczuję projektu, ale przez swoje X lat pisania w C# nie miałem tego problemu ani razu :P.

0

wlasnie mialem pisac ze znalazlem posrednie rozwiazanie ale nie cale

Dzieki @msm. Znalazlem opcje w debuggerze by to wylaczyc, ale wylaczenie wszystkiego nie bylo dobrym rozwiazaniem natomiast

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

jest idealne :)

2
fasadin napisał(a):

@Wielki Mlot Tak wywolanie sie gettera PODCZAS DEBUGGOWANIA, PODCZAS NAJECHANIE MYSZKA NA OBIEKT to jest WTF. Debugowalem w swoim zyciu troche, ale czegos takiego po prostu nie widzialem nigdy. Dlatego sie zapytalem czy jest mozliwosc wylaczenia tego, bo dla mnie to normalnie nie jest (zachowanie rozumiem, nadal najechanie myszka na obiekt nie powinno zmieniac jego stanu. Dopiero RECZNE wywolanie tego gettera powinno zmienic stan obiektu)

Geter z punktu widzenia użytkownika obiektu działa jak pole, tzn. zwraca wartość. Normalnym zachowaniem debugera jest pokazywania wartości pól obiektu, zatem logiczne jest też pokazywanie wartości właściwości obiektu.
Ale geter jest także metodą, tzn. może zawierać logikę. Zazwyczaj używa się jej do dynamicznego obliczenia wartości danej właściwości, np. pola na podstawie długości boków w klasie reprezentującej kwadrat. Co niby w takim przypadku w debugerze miałby zwrócić geter, gdyby nie wykonał kodu?
Dlatego wywołanie gettera podczas debugowania to nie jest żaden WTF tylko w pełni uzasadnione zachowanie.

A, że jakiś gość, który nie rozumie co to są właściwości, wepchnął do gettera kod mutujący obiekt, to już nie wina twórców VS ani C# tylko jego. Rozwiązanie problemu na teraz, to poprawienie kodu, a na przyszłość to nie dopuszczanie osób nie znających ABSOLUTNYCH PODSTAW języka do pisania w nim.

1 użytkowników online, w tym zalogowanych: 0, gości: 1