Существует ли способ заставить VS2008 прекращать предупреждать меня о недостижимом коде?

У меня есть несколько опций конфигурации в моем приложении вроде

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

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

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

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

32
задан Earlz 18 December 2009 в 21:27
поделиться

7 ответов

Чтобы disable:

#pragma warning disable 0162

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

#pragma warning restore 0162

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

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

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

55
ответ дан 27 November 2019 в 19:44
поделиться

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

#if ExecuteThis
    DoThis();
#endif

#if ExecuteThat
    DoThat();
#endif
22
ответ дан 27 November 2019 в 19:44
поделиться

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

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

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

11
ответ дан 27 November 2019 в 19:44
поделиться

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

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

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

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

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

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

Используете ли вы константы вместо "определяет"?

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

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

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

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

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

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

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

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

мы просто замкнули метод, добавив в какой-то момент возврат, не удаляя (или даже не закомментировав) код, который следует за ним.
  • Код, который зависит от некоторых настроек конфигурации (т. е. действителен только во время отладочных сборок).
  • Если ваш код не подпадает ни под одну из вышеперечисленных настроек, в каком конкретном случае ваша константа изменится ? Зная это, мы можем лучше ответить на ваш вопрос о том, как с этим справиться.

    мы просто замкнули метод, добавив в какой-то момент return, не удаляя (или даже не закомментировав) код, который следует за ним.
  • Код, который зависит от некоторых настроек конфигурации (т. е. действителен только во время сборки отладки).
  • Если ваш код не подпадает ни под одну из вышеперечисленных настроек, в каком конкретном случае ваша константа изменится ? Зная это, мы можем лучше ответить на ваш вопрос о том, как с этим справиться.

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

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

    24
    ответ дан 27 November 2019 в 19:44
    поделиться

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

    2
    ответ дан 27 November 2019 в 19:44
    поделиться

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

    #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.

    о штрафе за скорость .. да ..

    3
    ответ дан 27 November 2019 в 19:44
    поделиться

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

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

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

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

    3
    ответ дан 27 November 2019 в 19:44
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: