2016-01-06 27 views
6

Jaki jest najlepszy sposób sprawdzenia, czy tylko A ma wartość zerową, czy tylko B jest zerowe? Próbowałam wiele różnych sposobów, aby znaleźć coś, że czuje się czysty, a to, jak zawiłe to ma zdobyć:Jak najlepiej sprawdzić, czy A xor B ma wartość null?

bool CheckForNull(object a, object b) 
{ 
    if(a == null && b == null) 
    { 
     return false; 
    } 
    if(a == null || b == null) 
    { 
     return true; 
    } 
    return false; 
} 

Mój najlepszy (i najbardziej oczywiste) wersja:

bool CheckForNull(object a, object b) 
{ 
    return a == null && b != null || a != null && b == null; 
} 

Ale też tego nie lubię. (Pewnie mógłbym dodać nawias ...)

Czy istnieje standardowy sposób robienia tego, czego nigdy się nie nauczyłem?

Odpowiedz

14

Co o tym:

return (a == null) != (b == null); 
1

Można użyć operatora xor

bool CheckForNull(object a, object b) 
{ 
    return (a == null^b == null); 
} 
2

Jeśli potrzebujesz/chcesz użyć xor, można użyć:

return (a == null)^(b == null); 

ale dla że do pracy, true musi ocenić do tej samej "wartości".

Ale w tym przypadku, myślę, że zachowałbym to tak proste, jak to tylko możliwe. Twoja druga wersja nie wygląda tak źle, faktycznie:

return a == null && b != null || a != null && b == null; 

i istnieje możliwość wystąpienia początku zjazdu. (i jeśli ma szczęście, kompilator może nawet zoptymalizować to, aby było wykonywane równolegle (instrukcja potokowania)).

+0

True musi oceniać do tej samej wartości? Watcha? Kiedy prawda nie jest równa prawdy? – Evorlor

+1

@Evorlor W zależności od języka wszystko, co nie jest zerem, może być prawdziwe (0 jest fałszywe, wszystko inne jest prawdą). Więc jeśli twoja lewa "prawda" to 1, a prawa to 2, xor nie będzie działać zgodnie z oczekiwaniami. –