2016-01-06 5 views
6

Каков наилучший способ проверить, является ли только A нулевым или только B является нулевым? Я пытался много различных способов, чтобы найти что-то, что чувствует себя чистым, и это как запутанным он получил:Как я могу лучше проверить, являются ли A xor B пустыми?

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

Мой лучший (и самый очевидный) версия:

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

Но я тоже не нравится. (Конечно, я мог бы добавить скобки ...)

Есть ли стандартный способ сделать это, чего я никогда не узнал?

ответ

14

Что об этом:

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

Вы можете использовать оператор XOR

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

Если вам необходимо/хотите использовать XOR, вы можете использовать:

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

но что для работы true должен оценивать одно и то же значение.

Но в этом случае, я думаю, я сохранил бы его как можно проще. Ваша вторая версия не выглядит так уж плохо на самом деле:

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

и есть возможность из раннего выхода. (и, если повезет, компилятор может даже оптимизировать это для параллельного выполнения (конвейерная обработка команд)).

+0

Истина должна оцениваться с одинаковым значением? Что? Когда true не равно true? – Evorlor

+1

@Evorlor В зависимости от языка все, что не равно нулю, может оцениваться как true (0 - false, все остальное - true). Поэтому, если ваш «true» равен 1, а правый - 2, xor не будет работать должным образом. –