Подавление" никогда не используется "и" никогда не назначается " предупреждения в C#


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

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

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

или

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

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

Edit

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

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 97

4 ответа:

Да, они могут быть подавлены.

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

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

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


чтобы подавить предупреждения для "поле 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): предупреждение для CS0649: Поле ' ConsoleApplication19.Программа.dwReserved никогда не назначено, и оно всегда будет иметь значение по умолчанию 0


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

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

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

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

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

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

это имеет смысл, так как синтаксис объявлений свойств sugar компилируется в поле плюс методы getter и/или setter (add / remove в моем случае), которые ссылаются поле. Это удовлетворяет компилятор и предупреждения не возникают:

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
}

пользователи 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.