2016-05-18 3 views
0

Предположим, что у вас есть enum типа так:Пустой случай по умолчанию в частичном переключатель против, если предложение

public enum Type 
{ 
    A, B, C, D, E, F 
} 

Затем вы хотите сделать что-то в зависимости от некоторых значений, так что вы создать переключатель предложение:

switch (type) 
{ 
    case Type.A: // Do something 
     break; 
    case Type.B: // Do something 
     break; 
    case Type.C: // Do something 
     break; 
} 

Это компилируется и работает нормально, но затем Sonarqube 5.2 (с правилами по умолчанию для C#) проверяет код и жалуется на switch, не имеющий случая по умолчанию (он квалифицирует его как серьезную проблему). Таким образом, вы измените код на это:

switch (type) 
{ 
    case Type.A: // Do something 
     break; 
    case Type.B: // Do something 
     break; 
    case Type.C: // Do something 
     break; 
    default: // Do nothing 
     break; 
} 

Но тогда это SharpDevelop, кто жалуется, поседение дела по умолчанию, и говорят вам, что код не должен быть там, так как он не делает ничего.

Таким образом, вы в конечном итоге изменить код на if предложение:

if (type == Type.A) // Do something 
else if (type == Type.B) // Do something 
else if (type == Type.C) // Do something 

С помощью этого кода, ни SonarQube, ни SharpDevelop жалуются на всех. Ну, SharpDevelop любезно предлагает, чтобы if можно было преобразовать в switch.

Итак, какой путь лучше? Должен ли я добавить случай по умолчанию к switch и игнорировать SharpDevelop? Должен ли я игнорировать проблему в SonarQube? Или я должен просто пойти на предложение if? Есть ли другой способ сделать это более правильно?

+1

серьезно, у вас не должно быть нескольких расширений для VS, которые конфликтуют друг с другом. я предлагаю удалить их все и просто установить resharper;) ... использовать переключатель без по умолчанию. также используйте свой мозг !. –

+0

@ M.kazemAkhgary Я не использую Visual Studio, но SharpDevelop. И SonarQube является частью нашей непрерывной среды интеграции, мы не используем его как плагин. – Charlie

+2

о. простите за это. Я этого не знал. но ваш вопрос основан на мнениях. –

ответ

5

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

Что вы делаете, конечно, зависит от того, что подразумевается в вашем приложении по умолчанию. Есть ли действительно состояние, где «ничего не делать» - это хороший путь через код? Это обычно указывает на дефект или хрупкий код, который должен привести к рефакторингу. То же самое касается if блоков без else, которые вы предложили для работы. На самом деле, я удивлен, что сонарква не жалуется на это.

+0

Согласен. Отсутствие исключения по умолчанию (или выполнение некоторой логики по умолчанию) может иметь схожие последствия с «глотанием» исключения. – Ulric

+0

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

+1

@ CarlosAlejo - я согласен, это не всегда * неверно, но, по моему опыту, это редкость ... похоже, сонарквист согласен, следовательно, вы получили сообщение об ошибке/предупреждении. –

Смежные вопросы