c#缩短了没有返回值的求值

本文关键字:返回值 | 更新日期: 2023-09-27 18:05:11

我有一个EventHandler,它需要调用不同值的函数。如果有人返回true,那么停止前进并返回。这符合短路评估。最好的写法是什么?

的例子:

private void EventHandler(object sender, EventArgs e)
{
    // how to call foo(1), foo(3), foo(2)?
}
private bool foo(int i)
{
    return i == 3;
}

无聊的一个没有||:

private void EventHandler(object sender, EventArgs e)
{
    if (foo(1)) { return; }
    if (foo(3)) { return; }
    foo(2);
}
错误:

private void EventHandler(object sender, EventArgs e)
{
    foo(1) || foo(3) || foo(2);
}

愚蠢的||和无用的返回:

private void EventHandler(object sender, EventArgs e)
{
    if (foo(1) || foo(3) || foo(2)) { return; }
}

愚蠢的||和无用的赋值:

private void EventHandler(object sender, EventArgs e)
{
    var boo = foo(1) || foo(3) || foo(2);
}

有附加功能的傻蛋:

private void EventHandler(object sender, EventArgs e)
{
    bar();
}
private bool bar()
{
    return foo(1) || foo(3) || foo(2);
}
复杂:

private void EventHandler(object sender, EventArgs e)
{
    foreach (int i in new[] { 1, 3, 2 })
    {
        if (foo(i))
        {
            return;
        }
    }
}

Linq one(更难理解和维护):

private void EventHandler(object sender, EventArgs e)
{
    (new[] { 1, 3, 2 }).Any(i => foo(i));
}

我最好的选择是无用的回报。你还有别的选择吗?

c#缩短了没有返回值的求值

如果有很多不同的值,循环似乎是最好的选择。如果只有几个值(不超过3或4),您可以使用无用的返回,或者类似这样的内容(基本相同):

private void EventHandler(object sender, EventArgs e)
{
   if (foo(1) || foo(3) || foo(2)) { /* do nothing */ }
}

我认为foreach是最好的,因为它更灵活(如果你需要的话,你可以添加更多的值)。

如果您有许多处理程序,您可以使用List<Func<bool>>来保存您的事件处理程序列表:

List<Func<bool>> handlers = new List<Func<bool>>() {
    () => foo(1),
    () => foo(2),
    () => foo(3)
};
foreach (var handler in handlers) {
    if (handler())
        return;
}

您可能还想将事件传递给foo,但不清楚它的类型是什么,因此只需相应地更改Func签名。

我觉得你把事情弄得太复杂了。你试着写:"如果调用foo(1)返回false,调用foo(3)。如果调用foo(3)返回false,则调用foo(2) "为什么不直接这样写呢?

private void EventHandler(object sender, EventArgs e)
{
    // adjust indentation/braces as you see fit
    if (!foo(1))
        if (!foo(3))
            foo(2);
}