Есть ли способ заставить VS2008 перестать предупреждать меня о недоступном коде? - PullRequest
32 голосов
/ 19 декабря 2009

У меня в приложении есть несколько параметров конфигурации, аналогичных

const bool ExecuteThis=true;
const bool ExecuteThat=false;

, а затем код, который использует его как

if(ExecuteThis){ DoThis(); }
if(ExecuteThat){ DoThat(); } //unreachable code warning here

Дело в том, что мы можем делать несколько разные выпуски, а не ExecuteThis или ExecuteThat, и мы хотим иметь возможность использовать концы, чтобы у нас не было никаких штрафов за скорость таких вещей во время выполнения. Но я устал видеть предупреждения о недоступном коде. Я человек, которому нравится исключать все предупреждения, но я ничего не могу с этим поделать. Есть ли какая-нибудь опция, которую я могу использовать, чтобы отключить только эти предупреждения?

Ответы [ 8 ]

55 голосов
/ 19 декабря 2009

Для отключения:

#pragma warning disable 0162

Для восстановления:

#pragma warning restore 0162

Подробнее о #pragma warning см. MSDN .

Обратите внимание, что компилятор C # достаточно оптимизирован, чтобы не создавать недоступный код. Это называется устранение мертвого кода и это одна из немногих оптимизаций, которую компилятор C # выполняет .

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

25 голосов
/ 19 декабря 2009

Прежде всего, я согласен с вами, вам нужно избавиться от всех предупреждений. Каждое маленькое предупреждение, которое вы получаете, избавьтесь от него, устранив проблему.

Прежде чем я продолжу с тем, что при перечитывании равнозначно тому, что выглядит как напыщенная речь, позвольте мне подчеркнуть, что при использовании такого кода не наблюдается никакого снижения производительности. Используя Reflector для проверки кода, кажется, что код, помеченный как недоступный, фактически не помещается в выходную сборку.

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

Другими словами, чистый эффект избавления от этого предупреждения состоит в том, что вы избавляетесь от предупреждения.

Также обратите внимание, что этот ответ является мнением . Возможно, вы не согласны с моим мнением и хотите использовать #pragma, чтобы замаскировать предупреждающее сообщение, но, по крайней мере, иметь информированное мнение о том, что это делает. Если вы делаете, кого волнует, что я думаю.

Сказав это, почему вы пишете код, который не будет достигнут?

Используете ли вы consts вместо "define"?

Предупреждение не является ошибкой. Для вас заметка - проанализировать этот кусок кода и выяснить, правильно ли вы поступили. Обычно нет. В случае вашего конкретного примера вы намеренно компилируете код, который для вашей конкретной конфигурации никогда не будет выполняться.

Почему код даже там? никогда не выполнится.

Вас не смущает, что на самом деле означает слово "константа"? Константа означает «это никогда не изменится, и если вы думаете, это не изменится». Вот что такое константа. Это не будет, и не может и не должно измениться. Когда-либо.

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

Эта константа изменится? Если это так, то это, очевидно, не константа, а нечто, зависящее от типа вывода (Debug, Release), и это тип вещи "#define", поэтому удалите его и используйте вместо этого этот механизм. Для людей, читающих ваш код, становится понятнее, от чего зависит этот конкретный код. Visual Studio также услужливо затеняет код, если вы выбрали режим вывода, который не устанавливает определение, поэтому код не будет компилироваться. Это то, для чего были созданы определения компилятора.

С другой стороны, если константа не изменится, когда-либо, по любой причине, удалите код, он вам не понадобится.

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

Чтобы закончить этот ответ, мне интересно, не существует ли совсем другого решения вашей проблемы.

Часто, когда я вижу код с предупреждением «Обнаружен недоступный код», они попадают в одну из следующих категорий:

  1. Неправильное (на мой взгляд) использование const по сравнению с компилятором #define, где вы в основном говорите компилятору: "Этот код, пожалуйста, скомпилируйте его, , даже когда я знаю, что он не будет использоваться . ".
  2. Неправильно, как, впрочем, просто неправильно, как в коммутаторе, в котором есть блок-регистр, который содержит как бросок, так и разрыв.
  3. Остаток кода от предыдущих итераций, когда вы только что замкнули метод, добавив в какой-то момент возврат, не удаляя (или даже не комментируя) следующий код.
  4. Код, который зависит от некоторых параметров конфигурации (т. Е. Действителен только во время отладочных сборок).

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

22 голосов
/ 19 декабря 2009

А как насчет использования операторов препроцессора?

#if ExecuteThis
    DoThis();
#endif

#if ExecuteThat
    DoThat();
#endif
11 голосов
/ 19 декабря 2009

Ну, #pragma, но это безобразно. Интересно, будет ли ConditionalAttribute лучше - т.е.

[Conditional("SOME_KEY")]
void DoThis() {...}
[Conditional("SOME_OTHER_KEY")]
void DoThis() {...}

Теперь вызовы на DoThis / DoThat включены только в том случае, если SOME_KEY или SOME_OTHER_KEY определены как символы в сборке («символы условной компиляции»). Это также означает, что вы можете переключаться между ними, изменяя конфигурацию и определяя различные символы в каждом.

3 голосов
/ 28 сентября 2014

Вот хитрость:

    bool FALSE = false;
    if (FALSE) { ... 

Это предотвратит предупреждение. Подождите. Я знаю, что есть все это «Вы не должны использовать это, почему есть код, который не выполняется?». Ответ: потому что во время разработки вам часто нужно настроить тестовый код. В конце концов вы избавитесь от этого. Важно, чтобы код присутствовал во время разработки, но не выполнялся постоянно.

Иногда требуется временно удалить выполнение кода для целей отладки.

Иногда вы хотите временно урезать выполнение функции. Вы можете использовать это, чтобы избежать предупреждений:

... код .. {bool TRUE = true; if (TRUE) возврат; } ... больше кода ...

Эти вещи избегают предупреждения. Вы можете сказать, что если это временно, следует сохранить предупреждение. Да ... но еще раз ... может быть, вам не следует проверять его таким образом, но временно полезно вывести предупреждение, например, проводя весь день отладка сложного кода столкновения.

Итак, вы можете спросить, почему это важно? Что ж, эти предупреждения очень раздражают, когда я нажимаю клавишу F4, чтобы перейти к первой ошибке, и вместо этого сначала получаю 10 проклятых предупреждений, и я по колено в отладке.

Говорите, используйте #pragma. Что ж, это была бы хорошая идея, за исключением того, что я не могу найти способ сделать это глобально для всего моего проекта ... или таким образом, который будет работать с Unity3D, для чего я кодирую в C #. О, как бы полезно #include.

Неважно, используйте #if! Ну ... да ... но иногда они не то, что вы хотите. Они делают код грязным и нечитаемым. Вы должны правильно заключить в них свой код. Поместить if (false) перед блоком намного проще ... не нужно разделять блок, это делают фигурные скобки.

Что я делаю, так это делаю красивые глобально доступные FALSE и TRUE и использую их по мере необходимости, избегая ошибок.

И если я хочу проверить, действительно ли я их использую, я могу найти все ссылки, или более грубо, но столь же эффективно, удалить их и, таким образом, быть вынужденным посмотреть на каждое появление этого маленького трюка. *

3 голосов
/ 19 декабря 2009

Самый быстрый способ «просто избавиться от этого» без изменения кода - использовать

#pragma warning disable 0162

В вашем пространстве имен, классе или методе, где вы хотите подавить предупреждение.

Например, это больше не выдаст предупреждение:

#pragma warning disable 0162
namespace ConsoleApplication4
{
  public class Program
  {
    public const bool something = false;

    static void Main(string[] args)
    {
        if (something) { Console.WriteLine(" Not something" ); }

    } 
 }

Однако следует помнить, что НИКАКОЙ МЕТОД в этом пространстве имен не выдаст предупреждение снова ... и хорошо ... предупреждения существуют по причине (что, если это произошло, когда вы НЕ планировали, что оно будет недоступно?)

Я думаю, что более безопасный способ - записать переменные в файле конфигурации и прочитать их оттуда в начале программы, так что вам даже не нужно перекомпилировать, чтобы получить разные версии / релизы! Просто измените файл приложения и перейдите: D.

о штрафе за скорость ... да ... если сделать это таким образом, то потребуется штраф за скорость ... по сравнению с использованием const, но если вы действительно не беспокоитесь о том, чтобы набрать 1/100 миллисекунды больше ... пойти на это таким образом.

3 голосов
/ 19 декабря 2009

Тот факт, что у вас есть константы, объявленные в коде, говорит мне, что вы перекомпилируете свой код с каждым выпуском, который вы делаете, вы не используете "contants", полученные из вашего конфигурационного файла.

Итак, решение простое: - установить «константы» (флаги) из значений, хранящихся в вашем конфигурационном файле - используйте условную компиляцию, чтобы контролировать то, что компилируется, как это:

#define ExecuteThis
//#define ExecuteThat

public void myFunction() {
#if ExecuteThis
    DoThis();
#endif
#if ExecuteThat
    DoThat();
#endif
}

Затем, когда вы перекомпилируете, вы просто раскомментируете правильный оператор #define, чтобы получить правильный кусок скомпилированного кода. Есть один или два других способа объявить ваши флаги условной компиляции, но это просто дает вам пример и с чего начать.

2 голосов
/ 19 декабря 2009

Самый простой способ - перестать писать недоступный код: D # DontDoThat

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...