C# 逻辑的或看起来像条件的或

C# 逻辑的或看起来像条件的或,c#,C#,我不太清楚条件运算符和逻辑运算符。好的,看看我刚刚写的,让我重申一下:我的代码没有做它应该做的事情,基于条件和逻辑OR之间的差异 我将文本框作为日期字段,其文本属性默认设置为“mm/yyyy”。我的验证器对该条件和空值(如带有两个引号/“”/标记)求值为true。所以在所有这些之后,我用这个来检查值: if (tbEndDateMo.Text != "mm/yyyy" | tbEndDateMo.Text != "" | tbEndDateMo.Text != string.Empty) 当值

我不太清楚条件运算符和逻辑运算符。好的,看看我刚刚写的,让我重申一下:我的代码没有做它应该做的事情,基于条件和逻辑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/yyyy”
同时为空字符串

您应该检查:

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

但是,您应该考虑使用<代码> String。IsNullOrEmpty < /代码>方法,而不是<代码> =字符串。

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

您的条件不正确-有100%的可能性,即
tbEndDateMo.Text
不等于
“mm/yyy”
同时为空字符串

您应该检查:

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

但是,您应该考虑使用<代码> String。IsNullOrEmpty < /代码>方法,而不是<代码> =字符串。

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

你感知到的逻辑有缺陷。检查这一点:

让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
此外,请记住,没有“逻辑”和“条件”或/和。这些被称为“按位”和“逻辑”*)。他们之间唯一的差别是非常微妙的。这是因为|和&&在不需要时不计算子表达式,而|和&总是计算。因此:

MyClass x = null; // intentional

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

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

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

你所理解的逻辑中有一个错误。检查这一点:

让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
此外,请记住,没有“逻辑”和“条件”或/和。这些被称为“按位”和“逻辑”*)。他们之间唯一的差别是非常微妙的。这是因为|和&&在不需要时不计算子表达式,而|和&总是计算。因此:

MyClass x = null; // intentional

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

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


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

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

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

听起来像你想要的&,而不是|
|
,在这个上下文中,它不是按位OR,它只是一个非短路OR。考虑到您的代码,没有理由避免短路。@AnthonyPegram很可能是
&
,而不是
&
。还要注意,与string.Empty和“”相比是重复的、冗余的和重复的。您回答了自己的问题。如果某个空格也无效,则将其设置为程序可以检测到该空格。您可以按照建议对其进行修剪,这将使其与string.Empty kick-in进行比较,或者您可以更新以使用
!string.IsNullOrWhitespace(input)
,它将处理空字符串、空字符串和空白字符串。在本上下文中,您听起来像是想要&,而不是|
|
,它不是按位OR,只是非短路OR。考虑到您的代码,没有理由避免短路。@AnthonyPegram很可能是
&
,而不是
&
。还要注意,与string.Empty和“”相比是重复的、冗余的和重复的。您回答了自己的问题。如果某个空格也无效,则将其设置为程序可以检测到该空格。您可以按照建议对其进行修剪,这将使其与string.Empty kick-in进行比较,或者您可以更新以使用
!string.IsNullOrWhitespace(input)
,它将处理null、清空和空白字符串。IIRC,文本框从不从::Text属性返回
null
,但实际上作者很可能不知道该方法:)IIRC,文本框从不从::Text属性返回
null
,但事实上,作者很可能不知道这个方法:)那么,什么是正确的或最常用的方法呢?它已经萦绕了一段时间。我喜欢@MarcinJuraszek解决方案,但我不敢相信这不是一种常见的情况。。您使用了错误的运算符,因此@MarginJuraszek所写的内容是正确的。你只是写错了代码。周围没有共同的工作。。请更正代码:)我不是指文字上的变通方法,但你会这样做吗?是的。你必须组织你的条件,使它们在逻辑上是正确的。为此目的@MarcinJuraszek是正确的:)那么,正确的或最常用的方法是什么?它已经萦绕了一段时间。我喜欢@MarcinJuraszek解决方案,但我不敢相信这不是一种常见的情况。。您使用了错误的运算符,因此@MarginJuraszek所写的内容是正确的。你只是写错了代码。周围没有共同的工作。。请更正代码:)我不是指文字上的变通方法,但你会这样做吗