У меня есть файл HTTPSystemDefinitions.cs в проекте C #, который в основном описывает старые ISAPI Windows для использования управляемым кодом.
Сюда входит полный набор структур, относящихся к 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
}
источник
[StructLayout(LayoutKind.Sequential)]
убедиться, что макет памяти правильный (в текущей реализации он будет даже без этого атрибута, но AFAIK это не гарантируется). Если я правильно помню, компилятор C # обнаруживает наличие этого атрибута и автоматически подавляет эти предупреждения, поскольку знает, что поля должны быть там для взаимодействия. (Я мог ошибаться в этом, поэтому отправляю как комментарий вместо ответа).StructLayout
. Это кажется чище, чем подавление самих предупреждений.Ответы:
Да, их можно подавить.
Обычно я против подавления предупреждений, но в этом случае структуры, используемые для взаимодействия, абсолютно требуют наличия некоторых полей, даже если вы никогда не собираетесь (или не можете) их использовать, поэтому в этом случае я думаю, что это должно быть оправдано .
Обычно, чтобы подавить эти два предупреждения, вы исправляете проблемный код. Первый («... никогда не используется») обычно представляет собой запах остатков кода от более ранних версий кода. Возможно, код был удален, но поля остались позади.
Второй - обычно запах кода для неправильно используемых полей. Например, вы можете неправильно записать новое значение свойства обратно в само свойство, никогда не записывая в резервное поле.
Чтобы подавить предупреждения для « Поле XYZ никогда не используется », выполните следующие действия:
Чтобы подавить предупреждения для « Поле XYZ никогда не назначается и всегда будет иметь значение по умолчанию XX », выполните следующие действия:
Чтобы самостоятельно найти такие номера предупреждений (например, как я узнал, что использовать 0169 и 0649), вы делаете следующее:
Скопируйте 4-значный код предупреждения из соответствующего сообщения, которое должно выглядеть следующим образом:
Предостережение : согласно комментарию @Jon Hanna , возможно, для этого нужно сделать несколько предупреждений для будущих искателей этого вопроса и ответа.
#pragma warning disable XYZK
отключает предупреждение для остальной части этого файла или, по крайней мере, до тех пор, пока не#pragma warning restore XYZK
будет найдено соответствующее предупреждение . Сведите к минимуму количество строк, на которых вы отключите эти предупреждения. Приведенный выше шаблон отключает предупреждение только для одной строки.источник
//exists for interop
в Это дело.[StructLayout(LayoutKind.Sequential)]
комментарию Грега Бича по этому вопросу, атрибут обрабатывает взаимодействие намного лучше.Еще одно «решение» для устранения этих предупреждений - создание struct
public
. В этом случае предупреждения не выдаются, потому что компилятор не может знать, используются ли поля (назначаются) вне сборки.Тем не менее, «Interop» компоненты должны , как правило , не публично, а
internal
илиprivate
.источник
struct
какpublic
более вероятно будет ошибкой, чем предупреждение, которое мы пытаемся замаскировать. (Вероятно, вам не следует без надобности раскрывать типы, используемые для внутренней реализации, и типы с общедоступными полями, вероятно, не принадлежат общедоступному API). Просто чтобы подкрепить ваш совет, что такие типы должны быть «скорееinternal
илиprivate
» ;-).JsonConvert.DeserializeObject
и десериализируюсь в общедоступный класс, в котором представлены все свойства, так что я знаю, что будет возвращено. Просто сделать его открытым классом, пустым со всеми общедоступными строками, - это хороший короткий код, и теперь никаких предупреждений. Возможно, было бы лучше использовать динамический класс, поскольку вам не нужно явно указывать, что находится в массиве, но я думаю, что это будет хорошая ссылка для всех, кто надеется использовать объект.Я заставил VS сгенерировать каркас реализации,
System.ComponentModel.INotifyPropertyChanged
и события были реализованы как поля, которые вызвали предупреждения CS0067.В качестве альтернативы решению, приведенному в принятом ответе, я преобразовал поля в свойства, и предупреждение исчезло .
Это имеет смысл, поскольку сахар синтаксиса объявлений свойств компилируется в поле плюс методы получения и / или установки (в моем случае добавить / удалить), которые ссылаются на поле. Это удовлетворяет компилятор, и предупреждения не появляются:
источник
<GetHeader>k__BackingField
, в зависимости от деталей реализации используемого компилятора C #.Пользователи C / C ++ должны
(void)var;
подавлять предупреждения о неиспользуемых переменных. Я только что обнаружил, что вы также можете подавить предупреждения о неиспользуемых переменных в C # с помощью побитовых операторов:Оба выражения не вызывают предупреждений о неиспользуемых переменных в компиляторах VS2010 C # 4.0 и Mono 2.10.
источник
uint
, но не для других типов, напримерException
. Вы знаете общий трюк, эквивалентный C / C ++var;
?error.ToString();
для переменной типаException