Wywoluje sie getter podczas debugowania

Wywoluje sie getter podczas debugowania
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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...

edytowany 1x, ostatnio: fasadin
M4
A nie możesz korzystać z okienka Locals, czy wtedy też lista się powiększa?
fasadin
nie wiem nie sprawdzalem. Jednak to jest obejscie problemu a nie jego rozwiazanie ;)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Wrocław
0

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

fasadin
wyjasnilem w nastepnym poscie ;) mam nadzieje ze teraz jest bardziej jasne o co chodzi. Jak nie bedzie jasne to postaram sie pokazac na przykladzie
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:4 dni
  • Postów:2512
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.

edytowany 1x, ostatnio: Sarrus
fasadin
tak wiem, mowilem juz o tym innym wspolpracownikom...
fasadin
dokladnie do tego samego doszedlem wniosku (co Ty w edicie) ale stwierdzilem ze moze jesc jakas opcja...
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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

Sarrus
zobacz edit mojego postu
fasadin
zobacz komentarz do Twojego edita :D
somekind
Racja, pisanie takiego kodu nie jest normalne. Wklej tego gettera do "programistycznych WTF".
AreQrm
  • Rejestracja:prawie 11 lat
  • Ostatnio:19 dni
  • Lokalizacja:Londyn
  • Postów:873
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

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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)

AreQrm
  • Rejestracja:prawie 11 lat
  • Ostatnio:19 dni
  • Lokalizacja:Londyn
  • Postów:873
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


fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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

edytowany 1x, ostatnio: fasadin
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:4 dni
  • Postów:2512
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

edytowany 1x, ostatnio: Sarrus
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
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:

Kopiuj
[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.

edytowany 1x, ostatnio: msm
fasadin
nie wiem jeszcze jak zly/dobry jest projekt ;) na razie nie narzekam. Zobaczymy po kilku tygodniach jak bede z nim pracowal. A zreszta ciezko znalezc cos lepszego ;)
Sarrus
1) napisał że to nie jego kod 2) wie że to jest zły kod 3) nie chce go przepisywać. 1) ja to wiem 2) ty to wiesz 3) on to wie ;). Chodziło mi o to, że to kod jest wtfem, a nie zachowanie debuggera
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
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 :)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Wrocław
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.

msm
No ja to wiem, Ty to wiesz, fasadin to wie, ale IMO pomocna odpowiedź to odpowiedź na pytanie, a nie pobożne życzenia żeby wszyscy programiści nagle nauczyli się programować :P.
somekind
Gdyby wiedział, to nie pisałby, że sensowne zachowanie debugera to WTF.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)