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));
}
我最好的选择是无用的回报。你还有别的选择吗?
如果有很多不同的值,循环似乎是最好的选择。如果只有几个值(不超过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);
}