我对条件运算符与逻辑运算符有点不清楚。好吧,看看我刚刚写的内容,让我重申一下:基于条件OR和逻辑OR之间的差异,我的代码并没有做它应该做的事情。
我有一个文本框作为日期字段,默认情况下其文本属性设置为"mm/yyyy"。我的验证器针对这个条件和空值(如两个引号/"/标记(计算为true。所以在所有这些之后,我用这个来检查值:
if (tbEndDateMo.Text != "mm/yyyy" | tbEndDateMo.Text != "" | tbEndDateMo.Text != string.Empty)
当值为"mm/yyyy"时,它在IF内部传递,当值为空时也是如此。看看这篇微软参考资料,我理解其中的区别,我认为我是基于这一点编写代码的,但它并没有按照我希望的方式工作。如果文本框的值为"mm/yyyy"或空白(或空(,请跳过If。我做错了什么?
谢谢,
Risho
您的条件不正确-有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")
已经指出了程序流的问题。我注意到你声称逻辑"或"的作用似乎与条件"或"类似。如果你阅读这里的文档,你会发现它只执行逻辑或如果类型是积分的。您可以看到,它们是布尔值,因此它计算条件OR:(
您感知到的逻辑存在错误。检查:
让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
此外,请记住,没有"逻辑"one_answers"条件"OR/and。这些被称为"位"one_answers"逻辑">*(。它们之间仅有的区别非常微妙。它是||和&;在不需要时不计算子表达式,而|和&始终进行评估。因此:
MyClass x = null; // intentional
if( x != null && x.Field > 8) // will NOT throw
...
if( x != null & x.Field > 8) // WILL throw NullReferenceException
...
*)好吧,也许我已经习惯了旧的命名法,不管怎样,我写的其余内容都是有效的。