【问题标题】:c#: can you use a boolean predicate as the parameter to an if statement?c#:你可以使用布尔谓词作为 if 语句的参数吗?
【发布时间】:2011-02-16 08:35:15
【问题描述】:

在 C# 中,是否可以单独使用布尔谓词作为 if 语句的参数?

例如:

string str = "HELLO";
if (str.Equals("HELLO"))
{
    Console.WriteLine("HELLO");
}

这段代码会输出“HELLO”,还是必须这样:

string str = "HELLO";
if (str.Equals("HELLO") == true)
{
    Console.WriteLine("HELLO");
}

以上代码段如有其他错误,请指出。

编辑:根据答案双等于

【问题讨论】:

  • 与其在这里提问,不如在编译器中尝试这两个 sn-ps 不是更快更容易吗?
  • 我有一些我认为在我的代码中逻辑上等价的东西,但它没有按照这里的答案执行。我不知道出了什么问题。
  • 别忘了比较字符串时,HELLO 和 hello 是不一样的——大小写很重要。
  • IsEqual 只检查它们是否是同一个对象,因为如果它们相等,它们就是同一个对象。 .Net 中的字符串是不可变的,并且只创建一次。

标签: c# boolean if-statement


【解决方案1】:

好吧,后者 sn-p 甚至无法编译,因为它试图将true 分配 到str.Equals("Hello")(你有一个 = 而不是 ==)但是:

if (str.Equals("HELLO"))

或

if (str.Equals("HELLO") == true)

会起作用。不过,后者非常不鼓励 - 它非常丑陋。

请记住,字符串重载 ==,因此您可以实际编写:

if (str == "HELLO")

这有点简单。

【讨论】:

  • 只是为了稍微扩展 Jon 的回答,if 语句将使用任何计算结果为布尔结果的表达式。
  • 如果我遇到的结果与此答案相反,可能出了什么问题?字符串终止字符或其他内容是否存在问题?
  • 您可以随时尝试 str.Trim() == "HELLO" 以确保从字符串的开头和结尾删除任何空格。
【解决方案2】:

第二个版本甚至无法编译,因为您需要==,而不是=。

看到if (foo == true) 之类的代码让胆汁涌入我的嘴里。

【讨论】:

  • 如果foo 是一个可以为空的布尔值,foo == true 是一个有效的选项。
  • (foo == true != false) 的计算结果相同,但您的开发人员不会再邀请您参加他们的聚会了。
  • 詹斯,我从来没有说过它是无效的。
【解决方案3】:

是的,你可以。

(您的第二个示例需要 2 =(即 ==)才能正确)。

【讨论】:

  • 这是选择的答案,因为它是最早的。
【解决方案4】:

你能否单独使用布尔谓词作为 if 语句的参数

严格来说,this 的答案是否定的,因为 谓词 是一个函数(在数学意义上)。您可以在if 中用于条件表达式的是任何布尔表达式,包括(如此处)调用的结果一个值的谓词。

为了扩展,这里的“谓词”是“等于 HELLO”。它是一个函数(在数学意义上),对string 类型的值进行操作,并返回布尔值。获得布尔值后(通过将此函数应用于特定字符串 str),您无需显式将其与 true 进行比较:您可以直接使用它。

正如您从其他人的回答中看到的那样,将布尔类型表达式与布尔文字显式比较的代码通常会给读者带来代码风格的痛苦:)(我最喜欢的烦恼是​​<boolean expression> ? true : false)。

【讨论】:

  • isEquals() 不是函数吗?
  • @Craig Johnston :是的,'is equals' 是一个使用 两个 值并返回布尔值的函数。通过预先指定其中一个值,我们创建了一个谓词,一个使用 one 值并返回布尔值的函数。
  • 为什么说isEquals是一个消耗两个值的函数呢?它只消耗一个值:字符串参数。
  • @Craig Johnston :不,'equals' 有两个参数(要比较两个项目是否相等)。然而,'equals HELLO' 是一个不同的 函数,它只接受一个参数。由于它是一个接受一个参数并返回布尔值的函数,因此它是一个谓词。如果您想使用技术术语,可以将其称为“等于”的“部分应用”。
【解决方案5】:

您的代码是正确的,if 语句检查括号内的语句是否为真。

请记住,c# 中的比较使用 == 而不是 =,所以应该是 if (x == true)

这可以用于其他情况,例如:

bool isACat = true;

if (isACat)
{
}

最好将 is 或类似的标识符(Is/Has/Should/Will/Do/Must...)放在布尔变量名称之前,因为这样便于阅读你没有使用 == true。

【讨论】:

  • 您并不总是需要is 前缀。语义上可以是“是”或“否”的任何内容都是合适的。
  • 你不需要它,但这是一个很好的做法,而不是拥有 if (cat)
  • @SLC:我的意思是还有其他语义正确的标识符名称没有is 前缀。例如,hasSomeProperty,或任何动词-名词对,其中动词为第三人称简单现在时(与命令式相反,用于方法名称)。不过,我想更复杂的名称只适用于对象属性,因为有明确的主题。
  • @Will has 只是对 is、isFourLegged 或 hasFourLegs 的改写...关键是它应该被识别为布尔值。
  • @SLC: 当然可以,但是像hasCar 这样的东西呢? isInPossessionOfCar?或者如果SomeType 的对象接受连接,那么SomeType.AcceptsConnections 是true 呢?我只是说有时候is 不是合适的动词!
【解决方案6】:

没有错。

拿起同一个勺子喂自己只有两种不同的方式;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-06-06
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多