Это полезно, но я не уверен, почему это работает

2
protected override Boolean IsValid(String propertyValue)
{
    return !String.IsNullOrEmpty(propertyValue) && propertyValue.Trim().Length > 0;
}

Этот метод проверки на С# делает то, что я хочу, но я не знал, что вы можете использовать выражение short-circuiting следующим образом.

Если propertyValue имеет значение NULL, выполнение не требует выполнения второй части выражения для получения логического результата, и если да, то почему вторая часть не выбрасывает исключение null ref для Trim().Length > 0?

Я предполагаю, что вторая часть оценивает значение false или null, но мне любопытно узнать, что здесь происходит.

Извините, если мне не хватает чего-то действительно очевидного, пожалуйста, просветите меня.

Бог - мне не хватало чего-то очевидного, что идиот! - общий пробел в том, что, когда первая часть ложна, вторая часть не имеет значения, и я даже НЕ ЗНАЮ, что это было короткоживущим - извините для того, чтобы тратить время на людей, что смайлик для смущения?

Добавлен еще один тег, отражающий мое затруднение при наборе текста перед тем, как подумать.

Теги:
syntax
expression
short-circuiting

5 ответов

17
Лучший ответ

Это то, что делает короткое замыкание. Когда у вас

e1 && e2

и e1 оценивается как false, e2 вообще не оценивается.

(И для

e1 || e2

если e1 истинно, e2 вообще не оценивается.)

Это важно понять в случае, когда e2 имеет "эффекты" (делает I/O, генерирует исключение,...), поскольку короткое замыкание дает разную семантику программы, чем полная оценка.

  • 0
    Раньше это называлось полным логическим развитием во времена Turbo Pascal, и его можно было настраивать независимо от того, хотите ли вы по-прежнему оценивать все условия или нет.
  • 2
    напротив, вы можете использовать одиночный &, чтобы делать побитовое и, что заставляет обе стороны быть оцененными.
2

Для того, чтобы соединение было истинным, оба его компонента должны быть истинными. Из-за этого определения и потому, что С# сначала оценивает левую конъюнкцию, если левая конъюнкта принимает значение false, тогда ответ уже неверен, а С# не нужно оценивать правильную конъюнкцию.

2

Это происходит из-за && Оператор

Оператор условного-AND (& &) выполняет логическое-AND своих операндов bool, но при необходимости оценивает его второй операнд.

from MSDN

Хорошая возможность узнать о:)

Если у вас

A AND B

если A является ложным, A и B всегда будут оцениваться как false, поэтому не имеет значения, что такое B.

2

Это то, что означает короткое замыкание. Когда первый операнд дает false, вторая часть не нуждается в оценке, потому что в любом случае результат будет ложным.

0

Существует добавление (& &). Поэтому, когда первая часть ложна, ей не нужно оценивать вторую часть.

Это намного лучше, чем старые VB 6 дней, когда это утверждение привело бы к исключению с нулевой ссылкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню