2

是否可以在每行之前检查语句块的每一行的条件是否为真if (condition)

例如:

if (condition)
{
    DoSomething();
    DoSomethingElse();
    DoAnotherThing();
}

在某些时候,另一个后台进程可能在执行condition之前已设置为 false DoSomethingElse()。本质上,我正在寻找一种有效且更简单的说法:

if (condition) DoSomething();
if (condition) DoSomethingElse();
if (condition) DoAnotherThing();

实际上,它是一长段代码,执行一次,如果在任何时候更改了特定标志,我想放弃它。

收紧此类代码的最佳方法是什么。

4

7 回答 7

6

否 - 将检查一次条件,然后执行整个块。另一种选择可能是在区块中注入救助:

if (condition)
{
    DoSomething();
    if(!condition) return;
    DoSomethingElse();
    if(!condition) return;
    DoAnotherThing();
}

另一种方法是,如果可以对函数进行参数化,以便将它们放入循环中:

foreach (varmyParam in parameters)
{
    if(condition)
       DoSomething(myParam);
}

编辑

在考虑更多之后,这可能是您最好的选择:

List<Action> funcs = new List<Action> {DoSomething, DoSomethingElse, DoAnotherThing};
foreach( Action a in funcs)
{
   if(condition) a();
}

这要求所有方法都具有相同的签名(在您的情况下返回void不带参数),但它更简洁一些。

于 2013-08-29T14:45:34.990 回答
1

封装支票,也许?

if(condition)
    DoSomething(condition);

和里面DoSomething

if(condition)
{
    // do your stuff inside method.
}

这意味着您的代码现在看起来像:

DoSomething(condition);
DoSomethingElse(condition);
于 2013-08-29T14:47:21.297 回答
0

您可以将 lambda 与 an 一起使用,Action但这并不能真正节省太多输入:

Action<Action> exec = a => { if (condition) a(); };

exec(DoSomething);
exec(DoSomethingElse);
exec(DoAnotherThing);
于 2013-08-29T15:07:33.527 回答
0

您可以将其包装在 try/catch 块中,并在更改标志时在每个方法内引发异常:

try 
{
    DoSomething();
    DoSomethingElse();
    DoAnotherThing();
}
catch (FlagChangedException e)
{
    // do something to handle it
}
于 2013-08-29T14:50:08.263 回答
0

也许是这样的:

int step = 1;
bool running = true;

while (running && condition) {
   switch (step) {
      case 1: DoSomething(); break;
      case 2: DoSomethingElse(); break;
      case 3: DoAnotherThing(); break;
      // and maybe other cases
      default: running = false; break; // AFAIK you can't break out of both switch and while (without labels)
   }

   step = step + 1;
}
于 2013-08-29T14:56:18.540 回答
0

您可以将其包装在一个委托方法中,使用您的条件调用该方法,如果它为真,您可以执行您想要执行的方法。你甚至可以用一个函数列表来做到这一点:

void Main()
{
   DoSomething();
   DoIf(true, DoWork1);
   DoIf(false, DoWork2);
   var MyFunctions = new List<MyFunction>() { DoWork1, DoWork2 };

   foreach(var func in MyFunctions) {
       DoIf(someBoolCondition == 0, func);
   }
}

public delegate void MyFunction();

void DoSomething() {
   Console.WriteLine("Always");
}

public void DoWork1() {
    Console.WriteLine("Only if it was true");
}

public void DoWork2() {
   Console.WriteLine("Only if it was true");
}

void DoIf(bool condition, MyFunction function) {
   if(condition) {
       function();
   }
}

输出:

Always
Only if it was true
于 2013-08-29T14:57:27.133 回答
-1

听起来您正在使用多个线程-一个线程来完成工作,而其他一些线程可以取消工作请求。

如果是这种情况,您应该考虑只是中止执行工作的线程而不是设置一些标志。查看http://msdn.microsoft.com/en-us/library/System.Threading.Thread.Abort.aspx

这非常简单,并且可以使标志检查出您的工作线程。

Thread.Abort 的一个重要假设是在任务中间中止工作方法是安全的。您当前的标志检查解决方案允许当前执行的方法在放弃其余工作之前完成 - 所以请记住这一点。

于 2013-08-29T15:33:09.860 回答