如果内部if为true,则C#跳过if语句的其余部分

本文关键字:if 语句 余部 跳过 内部 true 如果 | 更新日期: 2023-09-27 18:26:29

我的代码如下:

public void Method()
{
    if (flagIsUp)
    {
         if (x = 1)
            code here;
         if (y = 2)
            code here;
         if (z = 3)
            code here;
    }
    if (buttonPressed)
    {
         code here;
    }
}

如果(y=2)为TRUE,它将跳到"if(flagIsUp)"块的其余部分(即它将跳过"if(z=3)"语句),然后继续使用该方法(即转到"if(buttonPressed)"?我试着打破;,但这需要一个循环。使用退货;简单地结束Method(),跳过代码的其余部分,这不是我的意图。

如果内部if为true,则C#跳过if语句的其余部分

对于您所拥有的构造,没有简单的关键字可以使用。您应该将其修改为使用else:

if (x = 1)
    code here;
else if (y = 2)
    code here;
else if (z = 3)
    code here;

首先,=赋值,=测试相等性。

也就是说,大多数时候,包括这里,else应该足够了:

if (y == 2)
    code here;
else if (z == 3)
    code here;
public void Method()
{
    if (flagIsUp)
    {
         if (x = 1)
         {
            code here;
         }  
         else if (y = 2)
         {
            code here;
         }
         else if (z = 3)
         {
            code here;
         }
    }
    if (buttonPressed)
    {
         code here;
    }
}

使用else来提供此

if (y == 2) {
  code1; 
} else{
  if (z == 3) {
    code2;
  } 
  code3;
}

原始代码与我的标记为清晰

if (y = 2)
  code1;
if (z = 3)
  code2;
code3; 

听起来你想要一个其他

if ( y == 2 ) { /* do stuff */ }
else if ( z == 3) { /* do other stuff */ }

您可以在if前面使用else,但如果需要,我建议您加上额外的大括号。

public void Method()
{
    if (flagIsUp)
    {
         if (x == 1)
         {
            code here;
         }
         if (y == 2)
         {
            code here;
         }
         else if (z == 3)
         {
            code here;
         }
    }
    if (buttonPressed)
    {
         code here;
    }
}

将代码移动到一个函数:

if (flagIsUp)
{
   doStuff(x, y, z);
}
...
void doStuff(int x, int y, int z)
{
   if (x == 1)
   {
      // do stuff
      return;
   }
   if (y == 2)
   {
      // do stuff
      return;
   }
   if (z == 3)
   {
      // do stuff
      return;
   }
 }

以下是关于它们如何在后端运行的一些答案和解释(因为从长远来看,了解为什么会对您有所帮助)

提出的一个简单答案是在每个后续的if语句之前使用else,比如

public void Method() 
{ 
    if (flagIsUp) 
    { 
         if (x == 1) 
            //code here; 
         else if (y == 2) 
            //code here; 
         else if (z == 3) 
            //code here; 
    } 
    if (buttonPressed) 
    { 
         //code here; 
    } 
} 

编译后运行的结果更像

public void Method() 
{ 
    if (flagIsUp) 
    { 
         if (x == 1)
         {
            //code here; 
            // Excecution skips to 'x==1 fastforward'
         }
         else
         {
             if (y == 2) // intentional indentation
             {
                 //code here;
                 // Excecution skips to 'y==1 fastforward'
             } 
             else
             {
                 if (z == 3) // intentional indentation
                 {
                     //code here;
                 }
             } // y==2 fast forward
         } // x==1 fast forward
    } 
    if (buttonPressed) 
    { 
         code here; 
    } 
} 

这个排列显示了if-else-if如何在条件中"缩进"子例程。如果A为真,那么它将跳过B和C的代码。如果A为假,而B为真,则跳过C。如果A和B为假,则检查C。

实现这一点的另一种方法是将此检查放入其自己的私有方法中,并在满足真实条件时从中返回

public void Method() 
{ 
    if (flagIsUp)
        DoFlagUpCheck();
    if (buttonPressed) 
    { 
         //code here; 
    } 
} 
private void DoFlagUpCheck()
{
     if (x == 1) 
     {
        //code here; 
        return; // Stop and return to Method()
     }
     if (y == 2) 
     {
        //code here; 
        return; // Stop and return to Method()
     }
     if (z == 3) 
     {
        //code here; 
        return; // Stop and return to Method()
     }
}

这样,代码执行将在第一个true条件下停止并从方法返回。如果A为真,则执行代码并返回,否则继续执行B…

值得考虑的一件事是,是否可以重构程序,使X、Y和Z可以在单个枚举中表示?由于x==1y==2z==3是互斥的,因此可能有一种方法可以使这组条件更具可读性,并最终得到更像的条件

public Method()
{
    if (flagIsUp)
    {
        switch(flagCondition)
        {
            case FlagX:
                //code here;
                break;
            case FlagY:
                //code here;
                break;
            case FlagZ:
                //Code here;
                break;
        }
    }
    if (buttonPressed)
    {
        //code here;
    }
}

最后,把最有可能的真实情况放在首位通常对性能有帮助。

您可以使用goto语句,即使它不利于代码可读性,也可以随心所欲。。。

public void Method()
{
    if (flagIsUp)
    {
         if (x = 1)
            code here;
         if (y = 2){
            code here;
            goto Outer;
         }
         if (z = 3)
            code here;
    }
    Outer:
    if (buttonPressed)
    {
         code here;
    }
}