【问题标题】:Trigger function(s) based upon Boolean result without using the iF word基于布尔结果触发函数而不使用 iF 字
【发布时间】:2015-04-23 22:43:57
【问题描述】:
if(someBoolTest()) dothis()
else dothat();

或者只是

if(someBoolTest()) dothis();

做这样的事情不是很好吗:

someBoolTest() => {dothis(),dothat()}

someBoolTest() => dothis()

这是用其他语言完成的吗? 我们如何在 C# 中做到这一点? (我不认为我们可以,那为什么不呢?)

编辑: 我知道三元操作,但这并没有使它看起来更好。用某种形式的 lambda 和代表来做这件事会很好..

【问题讨论】:

  • if 语句相比,您的语法有什么优势?
  • 你需要read this
  • 我真的不清楚这个问题的意义。这只是对 C# 不是函数式语言的不满吗?
  • 是的,这部分是咆哮。但同时,它提出了一个问题,为什么 C# 不能有这种语言扩展..|但我对 C# 很满意,我每天都在使用它……

标签: c# lambda delegates ternary


【解决方案1】:

我们如何在 C# 中做到这一点?

使用if-else 子句,就像您在示例中所做的那样。

可以发挥创造力并创造出这样的东西:

(SomeBoolTest() ? (Action)DoThis : DoThat)();

但那是非常不可读的代码,不要那样做。

【讨论】:

  • 我确信函数式语言有不同的方式来处理if-else 分支。不过,我看不出他们有什么问题。
  • @LastTribunal 什么是脏话?
  • @Black 他指的是if-else
  • 我只想说清楚。因为if-else 是编程的基本组成部分之一。使用?: Operator 的缺点是Short-circuit evaluation 不行。
  • 你能具体说明你对 if-else 结构的反感吗?
【解决方案2】:

你可以,但不应该,做一些类似于你提到的语法的事情,通过做一些愚蠢的事情,比如在 bool 类型上编写扩展方法,如下例所示:

public static class UselessExtensions
{
    public static void WhenTrue(this bool evaluatedPredicate, Action whenTrue)
    {
        if (evaluatedPredicate)
            whenTrue();
    }
}

public static class TryingUselessExtensions
{
    public static bool SomeBoolTest()
    {
        return true;
    }

    public static void DoIt()
    {
        SomeBoolTest().WhenTrue(() => Console.WriteLine(true));
    }
}

【讨论】:

  • 它将ifs推迟到较低的级别,这是一个改进
  • @Claies 如您所见,答案明确指出“类似于 语法 ...”,其目的不是摆脱 if 语句。
  • 是的,但在其他 cmets 中,发帖人提出问题的原因首先是他们不喜欢if-else,称其为“这些脏话,将从所有进化中删除语言”。这不是一个明智的声明,但发帖人已经明确表示他们想要一个替代 if-else,而不仅仅是隐藏它的语法(除非我很遥远)。
【解决方案3】:

我相信三元运算符是您正在寻找的:

变量=条件? value_if_true : value_if_false

因此,例如,如果您的条件满足,您希望 int 等于 0,如果不满足,则为 3:

int this = 500;
int that = 700;
int n = (this==that) ? 0 : 3;

在这种情况下,n 将被赋值为 3!有一个很好的 wikipedia 页面,过去看看 :)

Wikipedia page on ternary operators

【讨论】:

  • 当您希望条件表达式返回一个值并且每个操作数都是一个返回值的函数时,此方法很有用。然而,问题在于如何有条件地执行一对函数,而这两个函数都不返回值。
【解决方案4】:

你这样做

    bool myBool = true;
    bool newBool;
    public void Main()
    {
        MyFunction( newBool = (aFunctionThatReturnsABool == true) ? true: false);
    }

    public void MyFunction (bool aBool)
    {
        // stuff based on the bool
    }

但你实际上想做什么?

【讨论】:

  • 需要调用方法,不要设置变量
  • (aFunctionThatReturnsABool == true) ? true: false 完全等同于 aFunctionThatReturnsABool,顺便说一句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 2015-12-21
  • 2013-06-06
相关资源
最近更新 更多