У меня есть несколько опций конфигурации в моем приложении вроде
const bool ExecuteThis=true;
const bool ExecuteThat=false;
и затем код, который использует его как
if(ExecuteThis){ DoThis(); }
if(ExecuteThat){ DoThat(); } //unreachable code warning here
Вещь, мы можем сделать немного отличающиеся выпуски и не ExecuteThis или ExecuteThat, и мы хотим быть в состоянии использовать consts так, чтобы у нас не было штрафов скорости от таких вещей во время выполнения. Но я устал от наблюдения предупреждений о недостижимом коде. Я - человек, которому нравится устранять все предупреждения, но я ничего не могу сделать о них. Есть ли некоторая опция, которую я могу использовать для выключения просто этих предупреждений?
Чтобы disable:
#pragma warning disable 0162
Для восстановления:
#pragma warning restore 0162
Подробнее о #pragma warning
см. MSDN .
Обратите внимание, что компилятор C # достаточно оптимизирован, чтобы не выдавать недоступный код. Это называется устранением мертвого кода и является одной из немногих оптимизаций, которые выполняет компилятор C # .
И вы не должны волей-неволей отключать предупреждения. Предупреждения являются признаком проблемы. См. Этот ответ .
А что насчет использования инструкций препроцессора?
#if ExecuteThis
DoThis();
#endif
#if ExecuteThat
DoThat();
#endif
Ну, #pragma
, но это неровно. Интересно, будет ли ConditionalAttribute
лучше - то есть
[Conditional("SOME_KEY")]
void DoThis() {...}
[Conditional("SOME_OTHER_KEY")]
void DoThis() {...}
Теперь вызывает к DoThis
/ DoThat
включается, только если SOME_KEY
или SOME_OTHER_KEY
определены как символы в сборке («символы условной компиляции»). Это также означает, что вы можете переключаться между ними, изменяя конфигурацию и определяя разные символы в каждом.
Прежде всего, согласен с вами, вам нужно избавиться от всех предупреждений. Избавьтесь от каждого маленького предупреждения, которое вы получите, устраните его, решив проблему.
Прежде чем я перейду к тому, что при перечитывании составляет то, что выглядит как напыщенная речь, позвольте мне подчеркнуть, что, похоже, нет любое снижение производительности при использовании подобного кода. Используя Reflector для проверки кода, выяснилось, что код, который «помечен» как недоступный, фактически не помещается в выходную сборку.
Однако проверяется компилятор. Одно это может быть достаточно хорошей причиной, чтобы проигнорировать мою напыщенную речь.
Другими словами, чистый эффект избавления от этого предупреждения состоит только в том, вы избавляетесь от предупреждения.
Также обратите внимание, что это ответ - мнение . Вы можете не согласиться с моим мнением, и хотите использовать #pragma
, чтобы замаскировать предупреждающее сообщение, но, по крайней мере, иметь информированное мнение о том, что это делает. Если да, то кого волнует, что я думаю.
Сказав это, почему вы пишете код, который не будет достигнут?
Используете ли вы константы вместо "определяет"?
Предупреждение - это не предупреждение. ошибка. Это примечание для вас: проанализировать этот фрагмент кода и выяснить, правильно ли вы поступили. Обычно нет. В случае вашего конкретного примера вы намеренно компилируете код, который для вашей конкретной конфигурации никогда не будет выполняться.
Почему код вообще там? Он никогда не будет выполняться.
Вы не понимаете, что на самом деле означает слово «константа»? Константа означает, что "это никогда не изменится, никогда, и если вы думаете, что это изменится, это" я не собираюсь меняться, когда-либо, по любой причине, удалите код, он вам не понадобится.
В любом случае не становитесь жертвой простого исправления, чтобы просто отключить это предупреждение для этого фрагмента кода , это похоже на прием аспирина, чтобы «исправить» проблемы с болями в спине. Это краткосрочное решение, но оно маскирует проблему. Вместо этого исправьте основную проблему.
Чтобы закончить этот ответ, мне интересно, нет ли совершенно другого решения вашей проблемы.
Часто, когда я вижу код с предупреждением «Обнаружен недоступный код», они попадают в одну из следующих категорий:
const
по сравнению с компилятором #define
, где вы в основном говорите компилятору: «Этот код , пожалуйста, скомпилируйте его, , даже если я знаю, что он не будет использоваться . ". Если код вы have не подпадает ни под одну из вышеперечисленных настроек, каков конкретный случай, когда ваша константа изменится ? Зная это, мы можем лучше ответить на ваш вопрос о том, как с этим справиться.
мы просто замкнули метод, добавив в какой-то момент возврат, не удаляя (или даже не закомментировав) код, который следует за ним.Если ваш код не подпадает ни под одну из вышеперечисленных настроек, в каком конкретном случае ваша константа изменится ? Зная это, мы можем лучше ответить на ваш вопрос о том, как с этим справиться.
мы просто замкнули метод, добавив в какой-то момент return, не удаляя (или даже не закомментировав) код, который следует за ним.Если ваш код не подпадает ни под одну из вышеперечисленных настроек, в каком конкретном случае ваша константа изменится ? Зная это, мы можем лучше ответить на ваш вопрос о том, как с этим справиться.
в каком конкретном случае ваша константа изменится ? Зная это, мы можем лучше ответить на ваш вопрос о том, как с этим справиться. в каком конкретном случае ваша константа изменится ? Зная это, мы можем лучше ответить на ваш вопрос о том, как с этим справиться.Самый простой способ - перестать писать недостижимый код: D #DontDoThat
Самый быстрый способ «просто избавиться от этого» без изменения кода - использовать
#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.
о штрафе за скорость .. да ..
Тот факт, что у вас есть константы, объявленные в коде, говорит мне, что вы перекомпилируете свой код с каждым выпуском, который вы делаете, вы не используете «константы», полученные из вашего файла конфигурации.
Итак, решение простое: - установить "константы" (флаги) из значений, хранящихся в вашем файле конфигурации - используйте условную компиляцию для управления тем, что компилируется, например:
#define ExecuteThis
//#define ExecuteThat
public void myFunction() {
#if ExecuteThis
DoThis();
#endif
#if ExecuteThat
DoThat();
#endif
}
Затем, когда вы перекомпилируете, вы просто раскомментируете правильный оператор #define, чтобы скомпилировать правильный бит кода. Есть один или два других способа объявить флаги условной компиляции, но это просто пример и где начать.