2013-08-29 31 views
2

是否有可能在每行之前没有if (condition)的情况下检查语句块的每一行的条件是否为真?在没有多个IF语句的每行代码之前检查条件?

例如:

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

在一些点另一个后台进程可以DoSomethingElse()之前设置condition到假已经被执行。从本质上讲,我找话说的效率和更简便的方法:

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

在现实中它是一个代码块长,执行一次,我想如果在任何时候的特定标志改变放弃。

什么是收紧这种代码的最好办法。

+2

多态性。创建表示实体DoSomething(),DoSomethingElse()和DoAnotherThing()的类。然后调用myclass1.doThing(); myclass2.doThing()和myclass3.doThing()。在这些方法中,重定向到检查条件的单个方法,然后运行相应的函数。 http://sourcemaking.com/refactoring/replace-conditional-with-polymorphism –

+0

If,否则IF,否则If,否则...? – JsonStatham

回答

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没有参数),但它有点干净。

+0

这是一个比检查每一行更好的选择,我认为这就是我要去的! – iajs

+0

在这个世界上,你是如何使用这样的if语句来休息的? – Moop

+0

意思'return;' –

1

封装支票,也许?

if(condition) 
    DoSomething(condition); 

和内部DoSomething

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

现在含义代码如下:

DoSomething(condition); 
DoSomethingElse(condition); 
+0

IMO,用方法名思想很好地工作。如果我执行'DoSomething',我希望它能做... ..的事情。没什么。这也只是在解决问题。 – Default

+0

这将是;你是对的。但OP正在尝试清除该代码。通过将三个if语句在一个块中传播到一个if语句在三个块中,它绝对看起来更清晰。虽然同意方法名称。 – christopher

0

你可以扔在一个try/catch块包裹它扔每个方法里面的时候异常国旗变了:

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

您不应该对预期的正常程序流使用'try catch'。 'try catch'是针对意想不到的*不可恢复的问题。 – Default

+0

我相信目的是在一个单独的线程上运行这个代码 –

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; 
} 
+1

对我来说,这似乎更长,更混乱然后只是重复如果(条件)每行 – Moop

+0

我没有说这是完美的解决方案,只是一种可能性: - ) –

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 
0

你可以使用带有Action拉姆达但是这并不能真正节约多少打字:

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

exec(DoSomething); 
exec(DoSomethingElse); 
exec(DoAnotherThing); 
-1

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

如果是这样的话,您应该考虑放弃执行该工作的线程与设置某个标志。退房http://msdn.microsoft.com/en-us/library/System.Threading.Thread.Abort.aspx

这很简单,并保持标志检查你的工作线程。

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

+0

我强烈建议不要使用thread.abort来完成这个简单的事情。 http://stackoverflow.com/questions/421389/is-this-thread-abort-normal-and-safe – Moop

+0

我们不知道它有多简单 - OP只是一个虚拟的例子,但是指的是一个更大的块的代码。 –

+0

@Moop - 你的引用显示了Thread.Abort特别糟糕的情况,但我不会让这个指令避免Thread.Abort的一切... –