Подавление предупреждений "никогда не используется" и "никогда не назначается" в C # - PullRequest
103 голосов
/ 29 сентября 2010

У меня есть файл HTTPSystemDefinitions.cs в проекте C #, который в основном описывает ISAPI более старых окон для использования управляемым кодом.

Это включает в себя полный набор структур, относящихся к ISAPI, не все или которые используются кодом. При компиляции все члены поля этих структур выдают следующее предупреждение: -

Поле предупреждения 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' никогда не назначается и всегда будет иметь значение по умолчанию null

или

Предупреждение Поле 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' никогда не используется

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

Редактировать

Пример структуры: -

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader;
    internal SetHeaderDelegate SetHeader;
    internal AddHeaderDelegate AddHeader;

    UInt32  HttpStatus;               // New in 4.0, status for SEND_RESPONSE
    UInt32  dwReserved;               // New in 4.0
}

Ответы [ 4 ]

187 голосов
/ 29 сентября 2010

Да, их можно подавить.

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

Обычно, чтобы подавить эти два предупреждения, вы должны исправить код, вызывающий сбой.Первый («... никогда не используется») - это обычно запах кода остатков более ранних версий кода.Возможно, код был удален, но поля остались позади.

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


Для подавления предупреждений для " Поле XYZ никогда не используется", вы делаете это:

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169

Чтобы подавить предупреждения для" Поле XYZ никогда не назначается и всегда будет иметь значение по умолчанию XX", вы делаете это:

#pragma warning disable 0649
... field declaration
#pragma warning restore 0649

Чтобы самостоятельно найти такие номера предупреждений (т. Е. Как я узнал об использовании 0169 и 0649), вы делаете это:

  • Скомпилируйте код как обычно, это добавит несколькопредупреждения к вашему списку ошибок в Visual Studio
  • Переключитесь в окно «Вывод» и выберите «Построить вывод» и найдите те же предупреждения
  • Скопируйте 4-значный код предупреждения из соответствующегосообщение, которое должно выглядеть следующим образом:

    C: \ Dev \ VS.NET \ ConsoleApplication19 \ ConsoleApplication19 \ Program.cs (10,28): предупреждение CS 0649 : поле'ConsoleApplication19.Program.dwReserved' никогда не назначается и будетвсегда имеет значение по умолчанию 0


Предупреждение : согласно комментарию @ Jon Hanna , возможно, несколькодля этого нужны предупреждения, для будущих искателей этого вопроса и ответа.

  • Во-первых, прежде всего, акт подавления предупреждения сродни глотанию таблеток от головной боли.Конечно, иногда это может быть правильным, но это не универсальное решение.Иногда головная боль является реальным симптомом, который вы не должны маскировать, также как и предупреждения.Всегда лучше попытаться обработать предупреждения, устранив их причину, вместо того, чтобы просто слепо удалять их из результатов сборки.
  • Сказав, что, если вам нужно подавить предупреждение, следуйте схеме, которую я изложилвыше.Первая строка кода, #pragma warning disable XYZK, отключает предупреждение для остальной части этого файла или, по крайней мере, до тех пор, пока не будет найден соответствующий #pragma warning restore XYZK.Минимизируйте количество строк, на которых отключены эти предупреждения.Приведенный выше шаблон отключает предупреждение только для одной строки.
  • Также, как упоминает Джон, комментарий относительно того, почему вы это делаете, является хорошей идеей.Отключение предупреждения, безусловно, является запахом кода, когда оно выполняется без причины, и комментарий не позволит будущим сопровождающим тратить время на то, чтобы задуматься о том, почему вы это сделали, или даже удалить его и попытаться исправить предупреждения.
12 голосов
/ 27 сентября 2012

Другое «решение» для исправления этих предупреждений - создание структуры public. Тогда предупреждения не выдаются, потому что компилятор не может знать, используются ли поля (назначены) вне сборки.

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

5 голосов
/ 06 января 2012

Я получил VS для генерации каркаса реализации для System.ComponentModel.INotifyPropertyChanged, и события были реализованы в виде полей, которые вызывали предупреждения CS0067.

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

Это имеет смысл, поскольку синтаксис объявлений свойств сахара скомпилирован в поле плюс методы получения и / или установки (в моем случае, добавления / удаления), которые ссылаются на поле. Это удовлетворяет компилятору и предупреждения не выдаются:

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader {get;set;}
    internal SetHeaderDelegate SetHeader { get; set; }
    internal AddHeaderDelegate AddHeader { get; set; }

    UInt32 HttpStatus { get; set; }               // New in 4.0, status for SEND_RESPONSE
    UInt32 dwReserved { get; set; }               // New in 4.0
}
1 голос
/ 13 мая 2014

C / C ++ пользователи имеют (void)var; для подавления предупреждений о неиспользуемых переменных.Я только что обнаружил, что вы также можете подавлять предупреждения о неиспользуемых переменных в C # с помощью побитовых операторов:

        uint test1 = 12345;
        test1 |= 0; // test1 is still 12345

        bool test2 = true;
        test2 &= false; // test2 is now false

Оба выражения не генерируют предупреждения о неиспользуемых переменных в компиляторах VS2010 C # 4.0 и Mono 2.10.

...