Jak pozbyć się ostrzeżeń kompilatora „[jakieś zdarzenie] nigdy nie używane” w programie Visual Studio?


93

Na przykład otrzymuję to ostrzeżenie kompilatora,

Zdarzenie „Company.SomeControl.SearchClick” nigdy nie jest używane.

Ale wiem, że jest używany, ponieważ komentowanie go wyrzuca mnie jak 20 nowych ostrzeżeń o stronach XAML, które próbują użyć tego zdarzenia!

Co daje? Czy jest jakiś sposób, aby pozbyć się tego ostrzeżenia?


1
Czy możesz zamieścić przykład?
John Saunders,

Odpowiedzi:


145

Wydaje się, że jest to ostrzeżenie 67 i dlatego można je zlikwidować za pomocą:

#pragma warning disable 67

Nie zapomnij przywrócić go tak szybko, jak to możliwe (po deklaracji zdarzenia) za pomocą:

#pragma warning restore 67

Jednak chciałbym jeszcze raz sprawdzić i upewnić się, że podnoszenie się gdzieś zdarzeń, nie tylko zapisanie do niego. Fakt, że kompilator wypluwa 20 ostrzeżeń, a nie 20 błędów, gdy komentujesz wydarzenie, jest również podejrzany ...

Jest też interesujący artykuł na temat tego ostrzeżenia, a konkretnie jego zastosowania do interfejsów; jest dobra sugestia, jak radzić sobie z „niewykorzystanymi” zdarzeniami. Ważne części to:

Prawidłowa odpowiedź to sprecyzowanie, czego oczekujesz od zdarzenia, co w tym przypadku jest niczym:

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

Spowoduje to wyraźne pominięcie ostrzeżenia, a także dodatkowej implementacji normalnego zdarzenia wygenerowanej przez kompilator. A jako kolejna dodatkowa korzyść, skłania do zastanowienia się, czy ta implementacja bez robienia niczego jest naprawdę najlepsza. Na przykład, jeśli zdarzenie nie jest tak bardzo nieważne, jak nie jest obsługiwane, tak że klienci, którzy polegają na tej funkcjonalności, prawdopodobnie nie powiedzie się bez niej, lepiej wyraźnie wskazać brak wsparcia i szybko zawieść, rzucając wyjątek:

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

Oczywiście interfejs, który można z powodzeniem zaimplementować bez niektórych części jego funkcjonalności, czasami wskazuje, że interfejs nie jest optymalnie spójny i powinien zostać podzielony na oddzielne interfejsy.


Właśnie tego potrzebuję! Dziękuję Ci! Jedyną różnicą jest to, że dodałem własny komentarz obok 67, więc wiedziałem, co to będzie w przyszłości. Oto "dokładnie" to, co wpisałem ... #pragma warning disable 67 // zdarzenie nigdy nie używane zdarzenie publiczne RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao

12
To świetny link. Dzięki.
Max Palmer

Jest to przydatne; nie będzie na miejscu, ale po prostu coś, aby uruchomić bieżący pomysł ...
dudeNumber4

78

Jeśli jesteś zmuszony zaimplementować zdarzenie z interfejsu, którego implementacja nie potrzebuje, możesz wykonać następujące czynności, aby uniknąć ostrzeżenia.

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

Jeśli to zrobię, w dalszej części pliku, w którym to zrobię if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();, zostanie napisane, że „OnCompleteEvent nie istnieje w bieżącym kontekście”.
Almo

@Almo, zgadza się. Jednak opisujesz przypadek, w którym używasz zdarzenia, więc ostrzeżenie nie pojawi się, więc nie użyjesz poprawki dla ostrzeżenia. Dobrze? Zwykle masz interfejs określający zdarzenie i dwie podklasy. Nie korzysta się z wydarzenia i korzysta z tego rozwiązania. Drugi korzysta ze zdarzenia i nigdy nie rzucił ostrzeżenia.
Dirk Bester,

Minęło zbyt dużo czasu, ale otrzymywaliśmy ten błąd, mimo że był używany. Miało to coś wspólnego z tym, że została zdefiniowana w taki sposób, że kompilator pomyślał, że nie jest używany.
Almo,

Bardzo dziękuję za to proste rozwiązanie bardzo szalonej sytuacji!
M463

16

Drugim najlepszym sposobem jest imho, aby jasno stwierdzić, że wydarzenie nie jest obsługiwane przez wyrzucanie wyjątku, jeśli ktoś spróbuje je zasubskrybować.

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

W ramach wariantu możesz również pozostawić metody addi removepuste, aby po cichu zignorować subskrypcje zdarzenia.

Najlepszym rozwiązaniem jest refaktoryzacja kodu, być może ściągnięcie deklaracji zdarzenia do implementatora, jeśli to możliwe.

W ostateczności możesz również wyłączyć takie ostrzeżenie

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

Nie widzę tutaj znaczenia obiektów
zerowych

Wiem, czym jest obiekt zerowy i ten przypadek użycia jest omówiony w ostatnim akapicie. Przeczytaj uważnie całą odpowiedź.
vidstige

Wiem, co to jest obiekt zerowy. Uważam, że ten przypadek użycia jest objęty moim ostatnim akapitem.
vidstige

3

Możesz też wykonać następujące czynności:

public event EventHandler MyEvent = delegate {}

1

Kompilator najwyraźniej nie wie, że jest używany w kodzie XAML. Spróbuj pominąć ostrzeżenie w definicji zdarzenia.

Upewnij się też, że faktycznie gdzieś podnosisz wydarzenie.


Tak też myślałem, więc przeniosłem kod XAML do kodu znajdującego się za nim i pokazało to samo ostrzeżenie! I tak, jestem w 100% pewien, że to wydarzenie gdzieś się odbywa. Patrzę na to. Jest podłączony do przycisku.
jedmao

1

Możesz wyłączyć poszczególne ostrzeżenia.

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

W tym przypadku CS0219 jest ostrzeżeniem dotyczącym przypisywanych, ale nieużywanych zmiennych. Możesz użyć flagi / nowarn: 0219 lub dodać numer błędu w panelu właściwości projektu (w sekcji „Build” pamiętaj o usunięciu wiodącego CS). Należy pamiętać, że wszystkie ostrzeżenia tej klasy są pomijane .


1

Lub możesz dodać <NoWarn>67</NoWarn>do swojego projektu

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

9
spowoduje to wyłączenie ostrzeżenia w całym projekcie, potencjalnie ukrywając rzeczywiste problemy z nieużywanymi zdarzeniami.
vidstige
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.