2013-02-25 2 views
0

Я немного неясен об условном и логическом || oprators. Ну, глядя на то, что я только что написал, позвольте мне повторить это: мой код не делает того, что он должен делать, основываясь на различиях между условным и логическим ИЛИ.Логическое ИЛИ, похоже, действует как условное ИЛИ

У меня есть текстовое поле в качестве поля даты, которое по умолчанию имеет его текстовое свойство, равное «мм/гггг». Мой валидатор оценивает значение true для этого условия и для пустого значения (как и для двух котировок/""/меток). Так ведь это я проверяю значение с этим:

if (tbEndDateMo.Text != "mm/yyyy" | tbEndDateMo.Text != "" | tbEndDateMo.Text != string.Empty) 

Если значение «мм/гггг», она проходит внутри ПЧ и то же, когда значение пусто. Глядя на это Microsoft reference, я понимаю разницу, и я думал, что я написал код, основанный на этом, но он не работает так, как я этого хочу. Если текстовое поле оценивается как «mm/yyyy» или пустое (или пустое), пропустите IF. Что я делаю не так?

Спасибо,

Risho

+1

Вы звучите так, как хотите, а не | –

+1

'' ', в этом контексте не является побитовым ИЛИ, это просто не короткое замыкание ИЛИ. Нет причин, учитывая ваш код, чтобы избежать короткого замыкания. – Servy

+0

@ AnthonyPegram Ну, вероятно, '&&', а не '&'. – Servy

ответ

2

Вы условие неверно - есть 100% шанс, что tbEndDateMo.Text не равна "mm/yyy"или пустую строку в то же время!

Вы должны проверить, что:

if (tbEndDateMo.Text != "mm/yyyy" && tbEndDateMo.Text != "" && tbEndDateMo.Text != string.Empty) 

Тем не менее, следует использовать метод string.IsNullOrEmpty вместо == string.Empty

if (!string.IsNullOrEmpty(tbEndDateMo.Text) && tbEndDateMo.Text != "mm/yyyy") 
+0

IIRC, TextBox никогда не возвращает свойство «null» из :: Text, но, действительно, есть большой шанс, что автор не знает этого метода :) – quetzalcoatl

0

Там есть ошибка в вашей воспринимаемой логики. Проверьте это:

пусть tbEndDateMo.Text быть равен «» и давайте снижать экспрессию

tbEndDateMo.Text != "mm/yyyy" | tbEndDateMo.Text != "" | tbEndDateMo.Text != string.Empty 
"" != "mm/yyyy" | "" != "" | "" != string.Empty 
true | false | false 
true 

Скорее всего, вы хотели:

tbEndDateMo.Text != "mm/yyyy" && tbEndDateMo.Text != "" && tbEndDateMo.Text != string.Empty 

Кроме того, помните, что нет «логики» и "условные" OR/AND. Они называются «поразрядными» и «логическими» *). только разница между ними очень тонкая. Дело в том, что || и & & не оценивает подвыражения, когда это не требуется, тогда как | и & всегда оценивают. Поэтому:

MyClass x = null; // intentional 

if(x != null && x.Field > 8) // will NOT throw 
     ... 

if(x != null & x.Field > 8) // WILL throw NullReferenceException 
     ... 

*) в порядок, может быть, я привык к старой номенклатуре, в любом случае, все остальное, что я написал справедливо.

1

Указана проблема с потоком вашей программы. Я заметил, что вы утверждаете, что логическое ИЛИ похоже действует как условное или. Если вы прочтете документацию here, вы увидите, что она выполняет только логический или если типы являются интегральными. Вы можете видеть, они являются логическими, и поэтому он вычисляет условное ИЛИ :)

+0

Итак, каков правильный или наиболее часто используемый метод? На какое-то время это преследует. Мне нравится решение @MarcinJuraszek, но я не могу поверить, что это не будет обычной ситуацией. – Risho

+0

Ну .. вы использовали неправильных операторов, поэтому @MarginJuraszek был прав в том, что он написал. Вы просто написали неправильный код. Нет обычной работы ... просто исправьте код :) – christopher

+0

Я не имел в виду обходной путь литературно, но так, как вы это сделаете? – Risho

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