Blad w c# ?? czy jak

0

Napisałem taką klasę :

     class MyClass
        {
            List<int> listaIntow = new List<int>();
            public int propet { get { listaIntow.Add(5); return 5; } }
        }

teraz kiedy przegladam add watch itd to mi za kazdym razem dodaje 5 do listy :/. Wiec imho nie moge zobaczyć co sie dzieje w programie.

0

A gdzie tu błąd? Chcesz, żeby dodawało tę 5-tkę, to dodaje :) Jak Ci to przeszkadza, to usuń tę linijkę i problem z głowy.

0

Ale przecież w ten sposób nie da się używać debugera:/

0

Hm?
ale co innego ma dodawać? Przecież w jasno i dobrowolnie dodajesz 5 do listy

0

Chodzi o to, że debuger pobierając wartość pola też woła to get(). Miałem kiedyś podobną zagwozdkę, tylko u mnie get() zwracał wartość losową... wyobraźcie sobie debugowanie ;)

1

Przekształć to w metodę i będzie dobrze :D. Tylko pozwól że zapytam, po co ci taki egzotyczny get?

0
Kunai napisał(a)

Chodzi o to, że debuger pobierając wartość pola też woła to get(). Miałem kiedyś podobną zagwozdkę, tylko u mnie get() zwracał wartość losową... wyobraźcie sobie debugowanie ;)

Możesz rozjaśnić?
Bo nadal nie kumam gdzie tu jest błąd w C# :|

0

Nie ma tu mowy o błędzie - skąd niby debugger miałby magicznie zwrócić 5 - ale nie wywołując poprzedniej linii??

Co więcej - w ramach optymalizacji - debugger wywoła tą linie nawet jeśli odwołasz się do innego property w tej klasie.

Inna sprawa, że nie mam pojęcia po co Ci w programie tak pokrętna logika.

0

Na co mi tak pokrętna logika ? np. Aby zliczać liczbę wywołań.

Inna sprawa to wygoda:
Czasem lubie robić funkcje które można wywoływać poprzez zwrot poprzedniej funkcji przykładowo:

Pies.Lapa.Lapa.Lapa.Lapa.Glowa.Tulow.Ogon(2);// pies z dwoma ogonami

normalnie musiał bym to zrobić tak :

Lapa x = new Lapa("LapaDoPsa");
Lapa y = new Lapa("LapaDoPsa");
new Pies (x,y);

Problem ze nie da sie testowac debugerem psa poniewaz posiada propety Lapa:/
moge oczywiście napisać Pies.Lapa().Lapa() itd ale to marnotrastwo.

Jak by ktos pytał dlaczego nie użyje operatorów to odpowiadam - ponieważ po Wpisaniu Lapa zwraca mi sie interfejs z funkcjami a visual studio podpowiada mi jakie mam opcje.

0

Toś wymyślił :)

A czy nie możesz zrobić tak:

interface ICzesciPsa
{
}

class Lapa : ICzesciPsa
{
  int iloscPazurow;
}

class Ogon: ICzesciPsa
{
  int dlugosc;
}

class Pies
{
   List<ICzesciPsa> lista = new List<ICzesciPsa>();
   public Pies(params ICzesciPsa[] czesciSkladowePsa)
   {
     foreach (czesc in czesciSkladowePsa) lista.Add(czesc);
   }
}

i gdzieś w kodzie:

Pies azor = new Pies(new Lapa("LapaDoPsa"), new Lapa("Druga"), new Ogon(13), new Ogon(10));
0

Mogę ale sam porównaj zapis :
Pies azor = new Pies(new Lapa("LapaDoPsa"), new Lapa("Druga"), new Ogon(13), new Ogon(10));

Pies azor =Pies.Stworz.Lapa.Lapa.Ogon(13).Ogon(10);
poza tym pies może być hierarchią. A w takim wypadku :

CzescCiala tolow = new Tolow(new Lapa("LapaDoPsa"), new Lapa("Druga"));
Glowa glowa = new Glowa(tolow);

A to samo moim sposobem :
Pies p = Lapa.Lapa.Tolow.Glowa;

0

...

Pierwszy raz widzę, aby ktoś w ten sposób gmatwał kod.
Przecież to jest całkowicie niepoprawne używanie właściwości.

0

Zapewne masz rację. Nie zmienia to faktu że kompilator powinien mieć możliwość wyłączenia czytania właściwości.

0
somekind napisał(a)
Kunai napisał(a)

Chodzi o to, że debuger pobierając wartość pola też woła to get(). Miałem kiedyś podobną zagwozdkę, tylko u mnie get() zwracał wartość losową... wyobraźcie sobie debugowanie ;)

Możesz rozjaśnić?
Bo nadal nie kumam gdzie tu jest błąd w C# :|

Ależ ja wcale nie twierdziłem, że to błąd.

@StudentX: mylisz o właściwościach jak o zmiennych, zmienne debuger odczytuje w ten sam sposób tylko, to nie niesie żadnych efektów ubocznych. Przy odczytywaniu właściwości masz efekty uboczne (których nie chcesz!), bo to nie są zmienne, a raczej funkcje. Skoro chcesz widzieć wynik działania funkcji, to debuger musi tę funkcję wywołać, proste.

A ten Twój kod, to faktycznie, niespotykany w przyrodzie ;> Przypomina różne cukierki składniowe, w których nikt nigdy połapać się nie może.

0
StudentX napisał(a)

Zapewne masz rację. Nie zmienia to faktu że kompilator powinien mieć możliwość wyłączenia czytania właściwości.

I parzenia kawy.
A dla Ciebie to chyba i czytania w myślach.

Kompilator kompiluje Twoje bohomazy na kod IL. Niczego nie czyta.

Debuger zaś pozwala na śledzenie wykonywania kodu krok po kroku i nie ma najmniejszych przesłanek, żeby go upośledzać, bo ktoś stosuje dziwne i nienormalne operacje.
Chcesz wyłączyć te właściwości, to je zakomentuj po prostu :)

Perełka?

0

Mogę ale sam porównaj zapis :
Pies azor = new Pies(new Lapa("LapaDoPsa"), new Lapa("Druga"), new Ogon(13), new Ogon(10));

Pies azor =Pies.Stworz.Lapa.Lapa.Ogon(13).Ogon(10);

Porównuje i stwierdzam - pierwszy jest normalny, drugi jest do kitu. Uwierz mi, choć teraz może ci się to wydawać dziwne - nigdzie nie będziesz używał takich rzeczy, które teraz próbujesz zrobić. I nawet jeśli teraz tak napiszesz - za jakiś czas, gdy przyjdzie ci dalej rozwijać projekt - wtedy nadejdzie czas, że wywalisz ten przedziwny zapis i zastosujesz normalne praktyki programowania obiektowego :-)

Cóż .. - to tylko rada, zrobisz jak będziesz chciał.

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