Я сталкивался с этим:
bool Isvalid = isValid & CheckSomething()
bool Isvalid = isValid && CheckSomething()
Второй случай может быть сценарий короткого замыкания.
Так не можем ли мы всегда использовать только &
вместо &&
?
Я сталкивался с этим:
bool Isvalid = isValid & CheckSomething()
bool Isvalid = isValid && CheckSomething()
Второй случай может быть сценарий короткого замыкания.
Так не можем ли мы всегда использовать только &
вместо &&
?
& бит "И", что означает, что он работает на уровне бит. && является логическим "И", что означает, что он работает на логическом (истинном/ложном) уровне. Логическое И использует короткое замыкание (если первая часть ложна, нет необходимости проверять вторую часть), чтобы предотвратить запуск избыточного кода в то время как бит-мудрый И должен и каждый бит, чтобы он получил значение.
Вы должны использовать логический И (& &), потому что то, что вы хотите (& может поистине не делать правильно), но вам может потребоваться запустить метод отдельно, если вы хотите оценить его побочные эффекты:/p >
var check = CheckSomething();
bool IsValid = isValid && check;
В && второе выражение оценивается только в том случае, если первое верно.
И это всего лишь способ объединить два выражения, такие как true и true = true, true и false = false и т.д.
В С# есть два типа логических операторов для логических значений:
x & y
Логическое И
true
, только если x
и y
оценивают как true
x
, так и y
.x && y
Условное логическое И
true
, только если x
и y
оценивают как true
x
, и если x
оценивается как false
, он немедленно возвращает false
без оценки y
(короткое замыкание)Поэтому, если вы полагаетесь как на оценку x
, так и на y
, вы можете использовать оператор &
, хотя он редко используется и его труднее читать, поскольку побочный эффект не всегда понятен читателю.
Примечание. Бинарный оператор &
также существует для целочисленных типов, где он выполняет побитовое логическое И.
Я считаю, что вам что-то не хватает. Во втором сценарии CheckSomething не оценивается, если isValid - false
Оператор условного-AND (& &) выполняет логическое-AND своих операндов bool, но при необходимости оценивает его второй операнд.
http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx
Лучшее использование у меня до сих пор
void BooleanTestV1 (){
int num = 0;
bool IsOne = false;
for (int i = 0; i< 100; i++){
num = i;
if (IsOne == false) {
IsOne = num == 1;
}
}
if (IsOne) {
// Yeay it works!
}
}
void BooleanTestV2 (){
int num = 0;
bool IsOne = false;
for (int i = 0; i< 100; i++){
num = i;
if (IsOne == false && (IsOne = num == 1)) {
// Do Somehing...
}
}
if (IsOne) {
// Yeay it works!
}
}
void WhyUseOneAND() {
int num = 0;
bool IsOne = false;
for (int i = 0; i < 100; i++) {
num = i;
if (num < 0 & (IsOne == false && (IsOne = num == 1))) {
// If we are using &&
// isOne will never checking (num == 1)
// Because && will stop running after found a false (num < 0)
// Good for caching (here "IsOne" is the variable we cached)
// Note: anything here will not be executed, cuz num < 0 will never be true
}
}
if (IsOne) {
// Yeay it works!
}
}