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

StackOverflow https://stackoverflow.com/questions/1093315

Вопрос

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

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

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

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

Это было полезно?

Решение

Это может быть предупреждение 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 { }
}

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

Другие советы

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

public event EventHandler CanExecuteChanged { add{} remove{} }

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

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

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

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

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

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

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

public event EventHandler MyEvent = delegate {}

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

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

Вы можете отключить отдельные предупреждения.

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

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

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

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top