逻辑OR似乎像条件OR一样

时间:2013-02-25 17:55:16

标签: c#

我对条件与逻辑||有点不清楚oprators。好吧,看看我刚写的内容,让我重申一下:我的代码根据条件和逻辑OR之间的差异没有做它应该做的事情。

我将文本框作为日期字段,默认情况下其text属性设置为“mm / yyyy”。我的验证器评估此条件的真值和空值(如同两个引号/“”/标记)。所以在这之后我用这个检查价值:

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

当值为“mm / yyyy”时,它在IF内部传递,当值为空时传递相同。看看这个Microsoft reference,我理解差异,我认为我是基于此编写代码的 - 但它并不像我想要的那样工作。如果文本框的计算结果为“mm / yyyy”或空白(或为空),则跳过IF。我做错了什么?

谢谢,

Risho

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

指出了程序流程的问题。我注意到你声称逻辑OR看起来像条件​​或。如果您阅读文档here,您将看到它只执行逻辑或类型是不可变的。你可以看到,它们是布尔值,因此它计算条件OR:)

答案 2 :(得分: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
        ...

*)好吧,也许我已经习惯了旧的命名法,不管怎么说,其余的我写的都是有效的。