Операции C# bool для обнаружения любого ложного возврата
Я хотел бы написать что-то вроде следующего...
bool hasAnyInvalid = false;
hasAnyInvalid |= IsValidType1(...);
hasAnyInvalid |= IsValidType2(...);
hasAnyInvalid |= IsValidType3(...);
hasAnyInvalid |= IsValidType4(...);
if (hasAnyInvalid){ return false; }
Насколько я могу судить, вышесказанное не удастся, потому что истина | истина ложь
Как я могу использовать одну логическую переменную для проверки нескольких функций на ложность?
Мне нужно оценить каждую из функций IsValidType. Поэтому я не могу замкнуть его.
По сути, я хочу логические врата, которые, как только они сбываются, остаются верными. Кажется, я вспоминал, как делал это раньше в C++ с возвратами HRESULT, но, возможно, мы просто складывали целочисленное значение серьезности.
Я открыт для других способов решения этого.
РЕДАКТИРОВАТЬ: я плохо сформулировал этот вопрос, и включил несколько логических snafus (я хотел написать это как XOR). Я собираюсь оставить свой оригинальный вопрос выше, потому что люди специально прокомментировали это, и я ненавижу изменять историю.
4 ответа
Если вы хотите обнаружить один false
, вам нужно использовать &
не |
:
bool allValid = true; // Start it with "true"
allValid &= IsValidType1(...); // The first "false" will make "allValid" false
allValid &= IsValidType2(...);
allValid &= IsValidType3(...);
allValid &= IsValidType4(...);
if (!allValid) { // Invert "allValid" before returning
return false;
}
Это не приведет к короткому замыканию оценки функций по их значениям и вернет true
если любая из функций возвращает false.
bool[] results = new[] {
IsValidType1(),
IsValidType2(),
IsValidType3(),
IsValidType4()
};
return results.Any(b => !b);
Обратите внимание, что это выглядит как ваше требование: возврат true
если какой-либо из результатов false
,
Мне нужно оценить каждую из функций IsValidType. Поэтому я не могу замкнуть его.
Это должно означать, что у функций есть побочные эффекты, которые вы должны наблюдать. Просто убедитесь, что вы документируете свой код, чтобы никто не видел его и не осознавал, что изменение его на короткое замыкание при оценке функции может привести к ошибкам путем устранения побочных эффектов.
Насколько я могу судить, вышесказанное не удастся, потому что
true | true
являетсяfalse
,
Я не уверен, что заставляет тебя так думать. true | true
, то есть true or true
является true
, Вы можете думать о xor
, но это было бы true ^ true
,
Проблема с вашим кодом в том, что ваша переменная помечает недействительность, а функция проверяет правильность. Вы можете изменить возвращаемое значение каждого IsValid
позвоните, чтобы ответить на вопрос IsInvalid
, Просто добавьте !
перед каждым IsValid
вызов. Код будет выглядеть так:
bool hasAnyInvalid = false;
hasAnyInvalid |= !IsValidType1(...);
hasAnyInvalid |= !IsValidType2(...);
hasAnyInvalid |= !IsValidType3(...);
hasAnyInvalid |= !IsValidType4(...);
return hasAnyInvalid;
Нет необходимости в переменной, вы можете просто написать следующее:
private bool IsValidForAllTypes(...)
{
return IsValidType1(...) & IsValidType2(...) & IsValidType3(...) & IsValidType4(...);
}