Как мне избавиться от предупреждений компилятора [какое-то событие], которые никогда не использовались, в Visual Studio?

Например, я получаю предупреждение компилятора:

Событие Company.SomeControl.SearchClick никогда не используется.

Но я знаю, что он использовался, потому что его комментирование вызывает у меня как 20 новых предупреждений о страницах XAML, которые пытаются использовать это событие!

Что дает? Есть ли способ избавиться от этого предупреждения?


person jedmao    schedule 07.07.2009    source источник
comment
Не могли бы вы опубликовать пример?   -  person John Saunders    schedule 07.07.2009


Ответы (7)


Это похоже на предупреждение 67, и его можно подавить с помощью:

#pragma warning disable 67

Не забудьте восстановить его как можно скорее (после объявления события) с помощью:

#pragma warning restore 67

Однако я бы проверил еще раз и убедился, что вы где-то инициируете событие, а не просто подписываетесь на него. Тот факт, что компилятор выдает 20 предупреждений, а не 20 ошибок, когда вы комментируете событие, тоже вызывает подозрение ...

Также есть интересная статья об этом предупреждении и, в частности, о том, как оно применяется к интерфейсам; есть хорошее предложение, как бороться с "неиспользуемыми" событиями. Важные части:

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

public event EventHandler Unimportant
{
    add { }
    remove { }
}

Это полностью подавит предупреждение, а также дополнительную сгенерированную компилятором реализацию нормального события. И как еще одно дополнительное преимущество, это побуждает задуматься о том, действительно ли эта реализация, не делающая ничего, лучшей реализацией. Например, если событие не столько неважно, сколько не поддерживается, так что клиенты, которые полагаются на эту функциональность, вероятно, потерпят неудачу без нее, может быть лучше явно указать отсутствие поддержки и быстро выйти из строя, бросив исключение:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}

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

person lc.    schedule 07.07.2009
comment
Это именно то, что мне нужно! Спасибо! Единственная разница в том, что я добавил свой комментарий рядом с 67, чтобы я знал, что это будет в будущем. Вот именно то, что я набрал ... #pragma warning disable 67 // событие никогда не использовалось публичное событие RoutedEventHandler SearchClick; #pragma warning restore 67 - person jedmao; 07.07.2009
comment
Это отличная ссылка. Спасибо. - person Max Palmer; 25.01.2012
comment
Это полезно; не собираюсь держать на месте, но просто что-то, чтобы развить текущую идею ... - person dudeNumber4; 01.12.2016

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

public event EventHandler CanExecuteChanged { add{} remove{} }
person Adam Mills    schedule 09.09.2010
comment
Если я сделаю это, позже в файле, где я сделаю if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();, будет сказано, что OnCompleteEvent не существует в текущем контексте. - person Almo; 04.04.2014
comment
@Almo, это правильно. Однако вы описываете случай, когда вы ИСПОЛЬЗУЕТЕ событие, поэтому предупреждение не будет отображаться, поэтому вы не сможете использовать исправление для предупреждения. Правильно? Обычно у вас есть интерфейс, определяющий событие и два подкласса. Событие не используют, а используют это решение. Другой использует событие и никогда не выдавал предупреждения. - person Dirk Bester; 21.08.2014
comment
Прошло слишком много времени, но мы получали эту ошибку, хотя она использовалась. Имел какое-то отношение к тому, что он был определен таким образом, чтобы обмануть компилятор, заставив думать, что он не используется. - person Almo; 21.08.2014
comment
Большое спасибо за это простое решение очень сводящей с ума ситуации! - person M463; 26.10.2017

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

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

Как вариант, вы также можете просто оставить методы add и remove пустыми, чтобы игнорировать подписки на событие.

Лучшее решение - провести рефакторинг кода, возможно, передать объявление события разработчику, если это возможно.

В крайнем случае вы также можете отключить предупреждение, например

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
person vidstige    schedule 03.12.2013
comment
Я не понимаю, насколько здесь уместны нулевые объекты - person vidstige; 24.04.2018
comment
Я знаю, что такое нулевой объект, и этот вариант использования описан в последнем абзаце. Пожалуйста, прочтите внимательно ответ полностью. - person vidstige; 24.04.2018
comment
Я знаю, что такое нулевой объект. Я считаю, что этот вариант использования описан в моем последнем абзаце. - person vidstige; 24.04.2018

Вы также можете сделать следующее:

public event EventHandler MyEvent = delegate {}
person GrantA    schedule 14.08.2018

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

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

person SLaks    schedule 07.07.2009
comment
Я тоже так подумал, поэтому переместил код XAML в код позади, и он показал такое же предупреждение! И да, я на 100% уверен, что событие где-то поднимается. Я смотрю прямо на это. Он подключен к кнопке. - person jedmao; 07.07.2009

Вы можете подавить отдельные предупреждения.

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

В этом случае CS0219 является предупреждением о том, что переменные назначаются, но не используются. Вы можете использовать флаг / nowarn: 0219 или добавить номер ошибки на панели свойств проекта (в разделе «Сборка» не забудьте удалить начальную CS). Помните, что подавляет все предупреждения этого класса.

person Svend    schedule 07.07.2009

Или вы можете добавить <NoWarn>67</NoWarn> в свой проект

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>
person Simon    schedule 05.11.2013
comment
это отключит предупреждение во всем проекте, потенциально скрывая реальные проблемы с неиспользуемыми событиями. - person vidstige; 05.12.2013