实现以下伪代码的一种优雅方法(易于扩展,因为可能会有更多功能,而不仅仅是A和B)?
1. Execute A()
2. Execute B()
3. If A or B succeeded, then do C()
简单的代码
if (A() || B())
C();
不起作用,因为在这种情况下,如果A()
成功,则不会执行B()
。
答案 0 :(得分:4)
只需使用logical or operator:
(使用一个|
代替||
)
using System;
public class Program
{
public static bool A(){
Console.WriteLine("A");
return true;
}
public static bool B(){
Console.WriteLine("B");
return true;
}
public static void Main()
{
if(A() | B())
Console.WriteLine("Hello World");
}
}
// Output:
// A
// B
// Hello World
您可以使用.NET Fiddle来运行。
答案 1 :(得分:2)
使用非短路的“或”-|
(MSDN:Operator or)。
即使第一个操作数的值为true,运算符也会计算两个操作数,因此无论第二个操作数的值如何,结果都必须为true。
使用此|
运算符时,完全确实完成了问题中要求的内容,但编写需要维护的代码可能不是一个好主意。 |
通常用作“按位或”,并且大多数人不知道在C#中是否也将布尔值定义为“非短路或”。如果您决定使用它,则代码应考虑添加注释,最好是添加可验证所需行为的单元测试。
对于常规代码,我将首先捕获所有方法的结果,然后查看是否存在任何真值。
var results = new[] { M1(), M2(), M3(), M4() };
if (results.Any())
{ … }
答案 2 :(得分:-1)
假设我们具有以下三个功能:
public static void A() => Console.WriteLine("A");
public static void B() => Console.WriteLine("B");
public static void C() => Console.WriteLine("C");
您可以使用以下方法:
var task = Task.Run(A)
.ContinueWith(t => B(), TaskContinuationOptions.NotOnFaulted)
.ContinueWith(t => C(), TaskContinuationOptions.NotOnFaulted);
task.Wait();
将执行A()
,如果成功执行,则将执行B()
,如果成功,则将执行C()
。如果在执行A()
或B()
时发生任何异常,则不会执行子任务。
感谢@AlexeiLevenkov,如果这些方法正在做一些CPU密集型工作,那么将它们并行化将为您带来显着的性能优势,否则并行化可能会对您的工作产生负面影响!
Microsoft说:
并行化任何代码(包括循环)时,一个重要的目标是 尽可能多地利用处理器,而不会过度并行化 到并行处理的开销抵消了任何 性能优势