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

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

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

Когда propertyValue имеет значение null, выполнение по-прежнему не должно оценивать вторую часть выражения для получения логического результата, и если да, то почему вторая часть не генерирует исключение null ref для Trim(). Длина > 0 вызов?

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

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

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

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


person Gordon Mackie JoanMiro    schedule 04.11.2009    source источник


Ответы (5)


Вот что делает короткое замыкание. Когда у тебя есть

e1 && e2

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

(И для

e1 || e2

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

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

person Brian    schedule 04.11.2009
comment
Во времена Turbo Pascal это называлось полная логическая эволюция, и можно было настроить, хотите ли вы по-прежнему оценивать все условия или нет. - person Robert Koritnik; 04.11.2009
comment
Напротив, вы можете использовать одинарное & для побитового и, что заставляет оценивать обе стороны. - person oɔɯǝɹ; 04.11.2009

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

person Doctor Blue    schedule 04.11.2009

Это из-за оператора &&

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

из MSDN

Это хорошая функция, о которой нужно знать :)

Если у вас есть

A AND B

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

person RYFN    schedule 04.11.2009

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

person Ikke    schedule 04.11.2009

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

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

person Shiraz Bhaiji    schedule 04.11.2009