Як я можу позбутися попереджень компілятора [[якась подія] ніколи не використовувалась] у Visual Studio?


93

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

Подія "Company.SomeControl.SearchClick" ніколи не використовується.

Але я знаю, що він використовується, тому що його коментування видає мені як 20 нових попереджень сторінок XAML, які намагаються використати цю подію!

Що дає? Чи є хитрість, щоб позбутися цього попередження?


1
Ви можете опублікувати приклад?
Джон Сондерс,

Відповіді:


143

Здається, це попередження 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 { }
}

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


Це саме те, що мені потрібно! Дякую! Єдина відмінність полягає в тому, що я додав свій власний коментар біля 67, щоб я знав, що це буде в майбутньому. Ось "саме" те, що я набрав ... #pragma warning disable 67 // подія ніколи не використовувала публічну подію RoutedEventHandler SearchClick; #pragma попередження відновлення 67
jedmao

12
Це чудове посилання. Дякую.
Макс Палмер,

Це корисно; не збирається триматися на місці, а просто щось для запуску поточної ідеї ...
dudeNumber4

78

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

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

Якщо я це зроблю, пізніше у файлі, де я це роблю, буде сказано, if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();що "OnCompleteEvent не існує в поточному контексті".
Almo,

@Almo, це правильно. Однак ви описуєте випадок, коли ВИ використовуєте подію, і тому попередження не відображатиметься, тому ви не будете використовувати виправлення для попередження. Правда? Зазвичай у вас є інтерфейс, що вказує подію та два підкласи. Людина не використовує подію, а використовує це рішення. Інший використовує подію і ніколи не видавав попередження для початку.
Dirk Bester

Це було занадто довго, але ми отримували цю помилку, хоча вона використовувалася. Було щось спільне з тим, що це було визначено таким чином, щоб обдурити компілятор, думаючи, що він не використовується.
Almo

Щиро дякую за це просте рішення дуже шаленої ситуації!
M463

14

Другий найкращий спосіб - це імхо чітко заявити, що подія не підтримується, викидаючи виняток, якщо хтось намагається на нього підписатися.

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

Я не розумію, як нульові об’єкти тут доречні
vidstige

Я знаю, що таке нульовий об’єкт, і цей випадок використання висвітлено в останньому абзаці. Будь ласка, уважно прочитайте всю відповідь.
vidstige

Я знаю, що таке нульовий об’єкт. Я вважаю, що цей випадок використання висвітлений у моєму останньому параграфі.
vidstige

3

Ви також можете зробити наступне:

public event EventHandler MyEvent = delegate {}

1

Компілятор, мабуть, не знає, що він використовується в коді XAML. Спробуйте придушити попередження у своєму визначенні події.

Також переконайтеся, що ви насправді десь піднімаєте подію.


Це те, що я теж думав, тому я перемістив код XAML в код позаду, і він показав те саме попередження! І так, я на 100% впевнений, що подію десь піднімають. Я дивлюсь прямо на це. Він підключений до кнопки.
jedmao

1

Ви можете придушити окремі попередження.

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

У цьому випадку CS0219 є попередженням щодо змінних, які призначаються, але не використовуються. Ви можете використовувати прапор / nowarn: 0219 або додати номер помилки на панелі властивостей проекту (у розділі "Збірка" не забудьте видалити провідну CS). Майте на увазі пригнічує всі попередження цього класу.


1

Або ви можете додати <NoWarn>67</NoWarn>до свого проекту

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

9
це вимкне попередження у всьому проекті, потенційно приховуючи реальні проблеми з невикористаними подіями.
vidstige
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.