Анализатор обнаружил ситуацию, когда в операторе switch разные метки case содержат одинаковые фрагменты кода. Часто это свидетельствует об избыточном коде, который можно улучшить объединением меток. Но нередко одинаковые фрагменты кода могут быть причиной copy-paste программирования и являться настоящими ошибками.
Рассмотрим пример с избыточным кодом:
switch (switcher) { case 0: Console.Write("0"); return; case 1: Console.Write("0"); return; default: Console.Write("default"); return; }
Действия для нескольких значений 'switcher' действительно могут быть одинаковыми, поэтому код можно написать более компактно:
switch (switcher) { case 0: case 1: Console.Write("0"); return; default: Console.Write("default"); return; }
Если вы используете 'case expression', то объединить такие выражения под одно условие у вас не получится:
private static void ShowCollectionInformation(object coll, bool cond) { switch (coll) { case Array arr: if(cond) { Console.WriteLine (arr.ToString()); } break; case IEnumerable<int> arr: if(cond) { Console.WriteLine (arr.ToString()); } break; } }
В таком случае, вы можете вынести общий код в метод, что облегчит дальнейшее редактирование и отладку.
Теперь, рассмотрим пример из реального приложения, где разработчик допустил ошибку:
switch (status.BuildStatus) { case IntegrationStatus.Success: snapshot.Status = ItemBuildStatus.CompletedSuccess; break; case IntegrationStatus.Exception: case IntegrationStatus.Failure: snapshot.Status = ItemBuildStatus.CompletedSuccess; break; }
В присвоение статуса попала ошибка: у перечисления 'ItemBuildStatus' есть элемент 'CompletedFailed', который следовало присвоить в случае ошибки или исключения.
Исправленный код:
switch (status.BuildStatus) { case IntegrationStatus.Success: snapshot.Status = ItemBuildStatus.CompletedSuccess; break; case IntegrationStatus.Exception: case IntegrationStatus.Failure: snapshot.Status = ItemBuildStatus. CompletedFailed; break; }
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3139. |