2010-10-06 15 views
14

Jaka jest różnica między oceną == i równa się w C#?== vs Równe w C#

Ex,

if(x==x++)//Always returns true 

ale

if(x.Equals(x++))//Always returns false 

Zmieniano:

 int x=0; 
    int y=0; 

    if(x.Equals(y++))// Returns True 
+12

@ Moderatorzy: Przeczytajcie pełne pytanie przed zamknięciem jakiegokolwiek pytania. Jeśli masz prawo zamknąć każde pytanie, użyj ich we właściwym miejscu. –

+4

@ Jørn Schou-Rode, Arcturus, Oded, Pandiya Chendur, GregS: Ponieważ wszyscy głosowaliście, aby zamknąć to pytanie. Podaj mi poprawną odpowiedź na powyższe pytanie lub ponownie otwórz pytanie. –

Odpowiedz

12

Zgodnie ze specyfikacją jest to oczekiwane zachowanie.

Zachowanie pierwszy reguluje sekcji 7.3 specyfikacji:

operandów w wyrażeniu są obliczane od lewej do prawej. Na przykład w F(i) + G(i++) * H(i), wywoływana jest metoda F przy użyciu starej wartości i, a następnie metoda G jest wywoływana ze starą wartością i, w końcu metoda H jest wywoływana z nową wartością i. Jest to oddzielne i niezwiązane z pierwszeństwem operatora.

Zatem w x==x++ najpierw lewy argument jest oceniany (0), a następnie po prawej stronie jest oceniana (0, x staje 1), a następnie porównanie odbywa się: 0 == 0 jest prawdą.

Zachowanie drugiego reguluje sekcji 7.5.5:

  • jeśli M jest członkiem funkcja przykład uznane w wartości typu:
    • E jest oceniany. Jeśli ta ocena powoduje wyjątek, nie są wykonywane żadne dalsze kroki.
    • Jeśli E nie jest klasyfikowane jako zmienna, tworzona jest tymczasowa zmienna lokalna typu E, a wartość E jest przypisana do tej zmiennej. E jest następnie przeklasyfikowane jako odniesienie do tej tymczasowej zmiennej lokalnej. Zmienna tymczasowa jest dostępna w M, ale nie w żaden inny sposób. Tak więc tylko wtedy, gdy E jest zmienną rzeczywistą, osoba dzwoniąca może obserwować zmiany, które M robi w tym celu.
    • Lista argumentów jest oceniana zgodnie z opisem w punkcie 7.5.1.
    • M jest wywoływany. Zmienna, do której odnosi się E, staje się zmienną, do której się odwołuje.

Zauważ, że typy wartości są przekazywane przez referencję własnych metod.

Zatem w x.Equals(x++), pierwszy cel jest oceniana (E x zmienna), to argumenty są oceniane (0, x się 1), a następnie porównanie odbywa: x.Equals(0) fałszywe.

EDYCJA: Chciałem również dodać do komentarza opublikowanego przez dtb komentarz, który został wysłany, gdy pytanie zostało zamknięte. Myślę, że mówił to samo, ale z ograniczeniem długości komentarzy nie był w stanie wyrazić go w pełni.

4

Kolejność oceny. ++ ocenia pierwszy (drugi przykład). Ale w pierwszym przykładzie == wykonuje się najpierw.

+1

Nie zgadzam się wypróbować tego, patrz edytowana część –

+2

Wow! Nie mogę uwierzyć własnym oczom ... Wrócę do ciebie – Aliostad

+2

Sure Anytime .... ale wynik pozostanie taki sam, nawet jeśli przyjdziesz po roku ... :) –