.Equals - pytanie

0

Otóż , mam w swojej klasie x obiekt typu Brush .

I jak to jest teraz ,podczas działania programu :

1 ) Brush y = Brushes.Red ;

if(y.Equals(Brushes.Red)) - zwraca prawde , bo czemuż by nie.

2 ) Ale kiedy stworzyłem nowy wątek ( który ma wykonać pewne obliczenia względem obiektu mojej klasy ) i w nim jest w/w porównanie tylko na składowej obiektu , to już prawdy nie zwraca.
.
.
.

if(obiekt_klasy_x.kolor_alarmu.equals(Brushes.Red))

Gdzie kolor_alarmu to obiekt typu Brush . Może ktoś to wytłumaczyć ?

0

Chyba za mało kodu.
A co debbuger pokazuje?

0

Oczywiście wypisane tylko najważniejsze fragmenty . To co się dzieje po IF'ie , nie ma tutaj znaczenia , ważnym jest fakt ,że warunku nie spełnia .

Oczywiście sprawdzając w debuggerze , obiekt "jest czerwony" , wszystko się zgadza . Czy może na to wpływać ,że dzieje się to w osobnym wątku ?

0

Za mało kodu. Pokaż definicję obiekt_klasy_x.kolor_alarmu oraz miejsca, gdzie jest ustawiany.

0

Jakiego typu obiekt zwraca ta właściwość: kolor_alarmu

0

Wszystkie obiekty symbolizujące alarmy są zapisane w tablicy , w głównej klasie jako :

ArrayList baza_alarmow = new ArrayList();

Później po dodaniu jako : baza_alarmow.Add(new Alarm());

Nie ważne , co pobierane jest do konstruktora ale dodanie nowych elementów nie zależy ściśle od użytkownika . Następnie użytkownik może przez port rs232 przesłać wszystkie alarmy dalej ( i tu właśnie jest kłopot )

Pierwszy bajt jaki idzie przez port symbolizuje typ alarmu . I oto jesli pierwszy bit jest ustawiony , to mamy alarm czerwony , drugi to inny itd .

Więc przykładowo dla pierwszego elementu powinno być :

byte Flaga_alarmu = 0;
Alarm referencja = (Alarm) baza_alarmow[0];

if(referencja.kolor_alarmu.Equals(Brushes.Red))
Flaga_alarmu = 1;
if(referencja.kolor_alarmu.Equals(Brushes.Blue))
Flaga_alarmu = 2;
.
.
.
.
I nawet jeśli stworze obiekt :

Brush c = referencja.kolor_alarmu i warunek będzie wyglądał :

if(c.Equals(Brushed.Red)) to nie jest spełniony ( w debuggerze ewidentnie ma taka "wartość") . Wszystkie składowe pobranego obiektu się zgadzają .

0

Cześć

Klasa Brush, ani żadna klasa dziedzicząca po niej (z przestrzeni System.Drawing) nie dostarcza własnej definicji metody Equals. W związku z tym użyta zostanie domyślna implementacja Equals czyli porównanie na równość referencyjną. Wynik poniższego porównania jest oczywiscie równy true ponieważ redBrush oraz Brushes.Red to ten sam obiekt:

Brush redBrush = Brushes.Red;
bool res = redBrush.Equals(Brushes.Red);

Ale dla takiego porówniania będzie już false ponieważ w tym przypadku redBrush oraz Brushes.Red to zupełnie inne obiekty:

Brush redBrush = new SolidBrush(Color.Red);
bool res = redBrush.Equals(Brushes.Red);

Pomimo, że oba pędzle są czerwone. Dodatkowo należy pamiętać, że klasa Brush to tak naprawdę opakowanie na natywne API ukrywająca uchwyty do natywnych pędzli.

0

Dzięki za podpowiedź :)

Ale jeśli w konstruktorze ( bo tak dla domyślnego przypadku robię ) , użyje :

kolor_alarmu = Brushes.Green ;

To też nie ma prawa działać ? ( Bo nie działa ) .

hmm dodałem nowy button którego naciśniecie wywoluje metodę która jedynie co robi to właśnie porównuje i dacie wiarę , że dla tego obiektu zwraca prawdę ? A Gdy ten sam warunek wrzucę w metodę obsługiwaną w wątku z tym samym obiektem to już zwraca false ....

0

Poważnie nikt z Was mistrzów nie jest już w stanie pomóc ? Termin goni , a przez ten fakt stoję w miejscu bo nici z poprawnego przesyłu , nici z testów.

0

Już spieszę z odpowiedzią :)

Tak masz rację, porównanie wykonane w innym wątku powinno zwrócić false. Gdzie tkwi haczyk? Należy przyjrzeć się bliżej klasie Brushes. Otóż Brushes.Red w jednym wątku to nie ten sam obiekt co Brushes.Red zwrócony w innym wątku!!! Innymi słowy klasa Brushes zwraca inną instancję pędzla dla każdego wątku. W środku wykorzystuje oddzielny słownik do przechowywania pędzli dla każdego wątku.

Proponuję porównywać zawartość pędzla czyli jego kolor i inne cechy zamiast całych obiektów. Niestety będziesz musiał sprawdzać czy dany pędzel to SolidBrush, a może HatchBrush itd.

0

Dzięki już coś zaczęło się wyjaśniać :)

Tylko nie bardzo rozumiem , co do sprawdzania - bo w końcu zawsze porównuje do koloru .
Już nawet pisze w obsłudze :

Brush GettingAlarmColorm = obiekt.kolor_alarmu;

if(GettingAlarmColorm.Equals(Brushes.Red))

0

Ups. przez przypadek enter poszedł .

Czy wie kolega dokładnie jak mogę doprosić się ewentualnej prawdy od warunku ? W jaki sposób go sformułować ?

0
Brush redBrush = Brushes.Red;

new Thread(() =>
{
    Brush innerRedBrush = Brushes.Red;
    Brush anotherInnerRedBrush = Brushes.Red;

    MessageBox.Show(innerRedBrush.Equals(anotherInnerRedBrush).ToString()); // true
    MessageBox.Show(innerRedBrush.Equals(redBrush).ToString()); // false

    MessageBox.Show(((SolidBrush)innerRedBrush).Color.Equals(
        ((SolidBrush)anotherInnerRedBrush).Color).ToString()); // true

    MessageBox.Show(((SolidBrush)innerRedBrush).Color.Equals(
        ((SolidBrush)redBrush).Color).ToString()); // true

}).Start();
0

DZIĘKI !

Wszystko działa teraz pięknie ! Więcej takich ludzi ! Dziękuje Panowie :)

pozdrawiam

0

Chociaż wydaje mi się, że lepiej będzie ci przechowywać sam kolor (Color).
Brush to nie tylko SolidBrush i jeżeli nie musisz korzystać z innych Brushy, tak jak np. HatchBrush o którym wspomniał misiek bezpieczniej będzie użyć koloru.

Wtedy zwykłe equals będzie działało, bo Color jest strukturą i polega ono na porównaniu składowych, czego nie można zrobić w przypadku klasy Brush.

A Brush z koloru bardzo łatwo uzyskać (new SolidBrush(kolor)).

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