Подавление" никогда не используется "и" никогда не назначается " предупреждения в 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 ответа:
Да, они могут быть подавлены.
обычно я против подавления предупреждений, но в этом случае структуры, используемые для взаимодействия, абсолютно требуют присутствия некоторых полей, хотя вы никогда не собираетесь (или не можете) их использовать, поэтому в этом случае я думаю, что это должно быть оправдано.
обычно, чтобы подавить эти два предупреждения, вы бы исправить оскорбительный код. Первый."( .. никогда не используется") обычно это код-запах остатков от более ранних версий кода. Возможно код был удален, но поля остались позади.
второй, как правило, код-запах для неправильно используемых полей. Например, вы можете неправильно записать новое значение свойства обратно в само свойство, никогда не записывая в резервное поле.
чтобы подавить предупреждения для "поле 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.