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

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

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

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

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

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

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

ответ

17

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

e1 && e2 

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

e1 || e2 

если e1 является истинным, e2 не вычисляется вообще.)

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

+0

Это было вызвано ** полной логической эволюцией ** в дни Turbo Pascal, и она была настроена, если вы все еще хотите оценить все условия или нет. –

+2

, в отличие от этого, вы можете использовать сингл & для побитового и, что заставляет обе стороны оцениваться. –

2

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

2

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

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

из MSDN

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

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

A AND B 

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

2

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

0

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

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

Смежные вопросы