【问题标题】:Useful operators not yet implemented有用的运算符尚未实现
【发布时间】:2010-11-01 17:03:58
【问题描述】:

C# 中是否有空间用于 C# 中的 but 运算符?

即:

if (checkBox.Checked but comboBox.SelectedItem == null) { ... }

相对于

if (checkBox.Checked == false || (checkBox.Checked && comboBox.SelectedItem != null)) { ... }

还有哪些其他当前不存在的运算符可用于节省键入可读性较差的语句?

更新
KennyTM 已向我建议的but 运营商发布了excellent alternative,但它有点错过了重点。我知道可以组合现有的运算符来创建可能的 any 表达式,我只是想知道我的代码如何更好地表达我的意图。

“如果未选中复选框或未选中任何内容” 不扫描相当以及 “如果选中复选框但未选中任何内容” em>。

更新 2:
对于那些说“并且”与“但是”相同的人来说,这只是一个更新。虽然我同意这在逻辑上是正确的(而且我不会重新打开这个问题),但我想与您分享一段引言,暗示“and”和“but”之间的选择有时会产生很大的不同:

Had a curry for lunch in our customers canteen. It looked a bit like cat sick but it was quite tasty.
Phil Winstanley - 2011 年 2 月 22 日

非常感谢。 :)

【问题讨论】:

  • 如何制作这个社区维基?
  • 将帖子标记给版主。他们会为你做的
  • 我们非常需要一个对接操作员:)
  • 为什么要定义一个与句子的英文阅读不匹配的逻辑运算符?示例:如果正在下雨,但窗户仍然开着与此 C# 含义相同:if (raining && windowState == open).
  • @Neil:如果这是您的意图,那么它与 BUT 的日常语义几乎没有相似之处。它也与您的句子不同,“如果选中了复选框但未选择任何内容”。

标签: c# operators


【解决方案1】:
(a but b)  ==  (!a || (a && !b))
           ==  ((!a || a) && (!a || !b))
           ==  (!a || !b)

因此

if (!checkBox.Checked || comboBox.SelectedItem != null) { ... }

我发现这并不比创建一个新运算符的可读性差多少。此外,andornot 在编程语言中对布尔变量具有明确的含义,但 but 不是,因此您需要浪费一行解释 (a but b) == (!a || !b) 的文档,而不是a && !ba && b 给大家。不值得。

【讨论】:

  • (!a || !b) == !(a && b)
  • 哈哈,只见树木不见森林。事情是,这就是我的意思 - 我想更好地传达 intent - 而这些类型的双重否定和 - 或类型表达式通常可能是难以发现的根源错误。
  • +1 我发现使用现有的运算符比创建一个我必须学习的新运算符更容易理解。
  • 即“如果未选中复选框或所选项目不为空”不能很好地扫描。我想编写表达意图的代码:“如果选中复选框但未选择任何内容”。
  • @Neil:那应该只是checkbox.Checked && comboBox.SelectedItem != null 吗?为什么会有checkbox.Checked == false
【解决方案2】:

是什么阻止您编写 But Extension 方法?

public static bool But(this bool original, bool secondExpression)
{
  return original || (original && secondExpression));

}

在我看来,这更好,因为它促进了编程成一种语言,而不是仅仅使用一种语言。

【讨论】:

  • 这减少到return original
  • 啊哈哈!我刚刚意识到,如果原来是真的,短路会立即返回真。
【解决方案3】:

我认为“但是”和“和”的意思是一样的!例如。 “我喜欢 C# 但我讨厌 C++”与“我喜欢 C# 而我讨厌 C++”的含义相同。它们都是连词(连接语句)。

在您的示例中,您肯定只希望 if 语句的主体在组合框被选中但没有选定项目的情况下执行?这意味着要归档,必须选中组合框; IE。: checkBox.Checked && comboBox.SelectedItem == null

因此,我认为你关于“但是”应该翻译成什么的例子是不正确的。

我的 C# 生锈了,但是如果有一种方法可以在 C# 中定义宏之类的东西,您可以将“but”定义为“&&”的别名,但我认为它不会带来什么好处。

【讨论】:

  • ||如果第一个表达式炸弹会短路。
  • 否 - 我希望在未选中复选框或选中复选框但未选中任何内容时执行语句的主体。
  • Neil:如果您希望在未选中复选框的情况下执行该语句,那不是 BUT 这个词的日常语义所暗示的!所以你需要为这个运算符想一个不同的词。
【解决方案4】:

如果我们从这里开始,它在哪里结束。但是,如果你喜欢这样的东西,也许 Boo 适合你。这允许您添加自己的语法。

【讨论】:

    【解决方案5】:

    在 Perl 中,你可以这样写:

    if ($checkBox.Checked) doSomething() unless (!$comboBox.SelectedItem);
    

    就个人而言,我非常赞成更具表现力的语言,但这必须与TMTOWTDI 带来的痛苦相平衡。

    【讨论】:

    • 每一种流行的语言都会出现 TMTOWTDI。这几乎是一句格言:并非所有程序员的思维方式都完全相同,如果只有一种表达方式,那么程序员必须在使用该语言之前学会这种思维方式,这会阻止它变得流行。此外,编程通常遵循以下规则:您可以快速、简单或正确地完成它,但您很幸运能够获得两个,而不是全部三个。
    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多