C # пропустить оставшуюся часть оператора if - PullRequest
0 голосов
/ 03 марта 2012

мой код выглядит следующим образом:

public void Method()
{
    if (flagIsUp)
    {
         if (x = 1)
            code here;

         if (y = 2)
            code here;

         if (z = 3)
            code here;
    }

    if (buttonPressed)
    {
         code here;
    }

}

Что я ставлю под if (y = 2), чтобы, если его значение TRUE, оно пропускало к остальной части блока if (flagIsUp) (т.е. пропускало if) (z = 3) "заявление), и продолжить с методом (то есть перейти к" if (buttonPressed) "? Я пытался разорвать;, но это требует цикла. Использование возврата; просто завершает Method (), пропуская оставшуюся часть кода, который это не мое намерение.

Ответы [ 9 ]

1 голос
/ 03 марта 2012
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;
    }

}
1 голос
/ 03 марта 2012

Во-первых, = присваивает, == проверяет на равенство.

Тем не менее, в большинстве случаев, включая здесь, else должно быть достаточно:

if (y == 2)
    code here;
else if (z == 3)
    code here;
1 голос
/ 03 марта 2012

С вашей конструкцией нет простого ключевого слова, которое вы можете использовать.Вы должны изменить его, чтобы использовать else:

if (x = 1)
    code here;
else if (y = 2)
    code here;
else if (z = 3)
    code here;
0 голосов
/ 18 мая 2012

Вот некоторые ответы и объяснения относительно того, как они работают в бэк-энде (понимание того, ПОЧЕМУ будет полезно для вас в долгосрочной перспективе)

Один простой ответ состоит в том, чтобы использовать else перед каждым из следующих if утверждений, таких как

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 In if if "indent" внутри условного выражения. Если 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()
     }
}

Таким образом, выполнение кода останавливается и возвращается из метода при первом истинном условии. Если A истинно, введите код и вернитесь, в противном случае переходите к B ...

Стоит рассмотреть одну вещь: можно ли реорганизовать программу так, чтобы X, Y и Z могли быть представлены в одном перечислении? Так как x==1, y==2 и z==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;
    }
}

И, наконец, для производительности часто полезно сначала разместить наиболее вероятное истинное условие.

0 голосов
/ 03 марта 2012

Переместить код в функцию:

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;
   }
 }
0 голосов
/ 03 марта 2012

Вы можете использовать else перед if, но я рекомендую установить дополнительные скобки, если вы это сделаете.

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

}
0 голосов
/ 03 марта 2012

звучит так, как вы хотите еще

if ( y == 2 ) { /* do stuff */ }
else if ( z == 3) { /* do other stuff */ }
0 голосов
/ 03 марта 2012

Используйте else для размещения этого

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

Оригинальный код с моими маркерами для ясности

if (y = 2)
  code1;

if (z = 3)
  code2;

code3; 
0 голосов
/ 03 марта 2012

Вы можете использовать оператор 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;
    }

}
...