Какова самая краткая проверка синтаксиса для проверки предварительных условий и последующего вызова оператора switch? - PullRequest
0 голосов
/ 02 октября 2009

Какой самый краткий синтаксис объединяет проверку некоторых предварительных условий с оператором switch? Могу ли я объединить оператор if / else и switch?

if (!IsValid(text))
{
   DoSomeLogging();
}
else
{
   switch (text)
   {
     case "1":
        DoSomething();
        break;
     case "2"
        DoSomethingElse();
        break;
     default:
        break;
   }
}

Редактировать: Удален пропустить комментарий. Я не хотел переворачивать утверждение.

Ответы [ 9 ]

6 голосов
/ 02 октября 2009

Я бы не хотел объединять их, даже если бы мог. Я думаю, что это хорошая идея, чтобы отделить «проверки» и «обработки».

Как чудовищный хакер, вы могли бы сделать что-то вроде:

switch (Validate(text))
{
    case null:
        throw ArgumentException("Invalid text");
    case "1":
       DoSomething();
       break;
    case "2"
       DoSomethingElse();
       break;
    default:
        break;
}

... где Validate возвращает ноль, если текст недействителен. (Конечно, предполагается, что null не является допустимым значением для начала.)

Но это ужасно. Я бы предпочел увидеть:

if (!IsValid(text))
{
    throw ArgumentException("Invalid text");
}
// No need for an else, just proceed with the switch from here
2 голосов
/ 02 октября 2009

Комбинированный переключатель else не является чем-то новым:

if (!IsValid(text))
{
    DoSomeLogging();
}
else switch (text)
{
}

совпадает с

if (!IsValid(text))
{
    DoSomeLogging();
}
else 
{
    switch (text)
    {
    }
}

Этот синтаксис был унаследован от C через C ++.

2 голосов
/ 02 октября 2009
if (IsValid(text))
{
   switch (text)
   {
     case "1":
        DoSomething();
        break;
     case "2"
        DoSomethingElse();
        break;
     default:
        break;
   }
}
0 голосов
/ 02 октября 2009

Операторы Switch часто являются кандидатами на замену полиморфизмом (например, см. здесь ), что может привести к более «элегантному» (краткому) коду:

if (!myObject.IsValid())
{
   DoSomeLogging();
}
else
{
    myObject.ExecuteSomeMethod();
}

Если вы беспокоитесь о том, что ваш код станет слишком многословным, возможно, вам стоит подумать о его реорганизации в иерархию классов?

0 голосов
/ 02 октября 2009

Краткая версия может быть:

switch (IsValid (text) ? text : null)
{
case null:
  DoSomeLogging ();
  break;
case "1":
  DoSomething();
  break;
case "2"
  DoSomethingElse();
  break;
default:
  break;
}

Однако я никогда не думал, что переключение строк - это особенно хорошая идея. Я не знаю, какой код сгенерирует здесь компилятор, поэтому не могу ничего сказать о производительности. Если это случайный путь к коду, возможно, все в порядке. Если это что-то называется много, то об этом следует опасаться.

0 голосов
/ 02 октября 2009

Я только что заметил, что вы можете объединить оператор if / else и switch. Это новое для 3.5?

if (!IsValid(text))
   DoSomeLogging();
else switch (text)
{
  case "1":
     DoSomething();
     break;
  case "2"
     DoSomethingElse();
     break;
  default:
     break;
}
0 голосов
/ 02 октября 2009

легко

 if (IsValid(Text)) 
    switch(text)
    { 
        // cases 

    }

или даже более кратко, если IsValid возвращает текст, если текст допустим, и ноль, если это не так,

 private string IsValid(string text)
 {
      if (/* code to check if text is valid */)
         return text;
      else return null;
 }

тогда все, что вам нужно:

 switch(isValid(text))
 {
      //cases:
 }
0 голосов
/ 02 октября 2009

Если // Skip действительно то, что есть, то просто инвертировать условие:

if (IsValid(text))
{
   switch (text)
   {
     case "1":
        DoSomething();
        break;
     case "2"
        DoSomethingElse();
        break;
     default:
        break;
   }
}
0 голосов
/ 02 октября 2009

Как насчет

if (!IsValid(text))
    return;
switch (text)
{
  case "1":
    DoSomething();
    break;
  ...
}

То есть, просто используйте ранний выход, не нужно пытаться объединить две конструкции.

...