在没有多个IF语句的每行代码之前检查一个条件?

时间:2013-08-29 14:42:36

标签: c# if-statement redundancy

在每行之前没有if (condition)的情况下,是否可以检查语句块的每一行的条件是否为真?

例如:

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

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

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

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

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

7 个答案:

答案 0 :(得分: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没有参数),但它更清晰。

答案 1 :(得分:1)

可能包括支票吗?

if(condition)
    DoSomething(condition);

DoSomething

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

现在您的代码的含义如下:

DoSomething(condition);
DoSomethingElse(condition);

答案 2 :(得分:0)

您可以将它包装在try / catch块中,并在更改标志时在每个方法中抛出异常:

try 
{
    DoSomething();
    DoSomethingElse();
    DoAnotherThing();
}
catch (FlagChangedException e)
{
    // do something to handle it
}

答案 3 :(得分: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;
}

答案 4 :(得分: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

答案 5 :(得分:0)

你可以使用带有Action的lambda,但这并不能节省太多的输入:

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

exec(DoSomething);
exec(DoSomethingElse);
exec(DoAnotherThing);

答案 6 :(得分:-1)

听起来你正在使用多个线程 - 一个线程来完成工作,另一个线程可以取消执行工作的请求。

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

这非常简单,并保持标志检查您的工作线程。

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