Bagaimana cara menyingkirkan peringatan kompilator "[beberapa acara] tidak pernah digunakan" di Visual Studio?

93

Misalnya, saya mendapatkan peringatan kompiler ini,

Acara 'Company.SomeControl.SearchClick' tidak pernah digunakan.

Tapi saya tahu itu digunakan karena mengomentarinya membuat saya seperti 20 peringatan baru dari halaman XAML yang mencoba menggunakan acara ini!

Apa yang memberi? Apakah ada trik untuk menghilangkan peringatan ini?

jedmao
sumber
1
Bisakah Anda memposting contoh?
John Saunders

Jawaban:

145

Ini tampaknya merupakan peringatan 67 dan karenanya dapat ditekan dengan:

#pragma warning disable 67

Jangan lupa untuk mengembalikannya sesegera mungkin (setelah deklarasi event) dengan:

#pragma warning restore 67

Namun, saya akan memeriksa lagi dan memastikan Anda mengangkat acara di suatu tempat, tidak hanya berlangganan . Fakta bahwa kompilator mengeluarkan 20 peringatan dan bukan 20 kesalahan ketika Anda mengomentari acara tersebut juga mencurigakan ...

Ada juga artikel menarik tentang peringatan ini dan khususnya bagaimana itu berlaku untuk antarmuka; ada saran bagus tentang cara menangani peristiwa "yang tidak digunakan". Bagian yang penting adalah:

Jawaban yang tepat adalah menjelaskan apa yang Anda harapkan dari acara tersebut, yang dalam hal ini, tidak ada artinya:

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

Ini akan menekan peringatan dengan rapi, serta implementasi tambahan yang dihasilkan oleh compiler dari peristiwa normal. Dan sebagai manfaat tambahan lainnya, ini mendorong seseorang untuk memikirkan apakah implementasi tidak melakukan apa-apa ini benar-benar merupakan implementasi terbaik. Misalnya, jika acara tidak terlalu penting karena tidak didukung, sehingga klien yang mengandalkan fungsionalitas cenderung gagal tanpanya, mungkin lebih baik untuk secara eksplisit menunjukkan kurangnya dukungan dan gagal dengan cepat dengan melempar pengecualian:

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

Tentu saja, antarmuka yang dapat diimplementasikan secara berguna tanpa beberapa bagian dari fungsinya terkadang merupakan indikasi bahwa antarmuka tidak kohesif secara optimal dan harus dipecah menjadi beberapa antarmuka terpisah.

lc.
sumber
Itulah yang saya butuhkan! Terima kasih! Satu-satunya perbedaan adalah saya menambahkan komentar saya sendiri di samping 67 jadi saya tahu apa itu di masa depan. Inilah "persis" yang saya ketik ... #pragma warning nonaktifkan 67 // event tidak pernah menggunakan acara publik RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao
12
Tautan yang bagus. Terima kasih.
Max Palmer
Ini berguna; tidak akan mempertahankan tempatnya, tetapi hanya sesuatu untuk menjalankan ide saat ini ...
dudeNumber4
78

Jika Anda dipaksa untuk mengimplementasikan kejadian dari sebuah antarmuka, yang tidak diperlukan implementasi Anda, Anda dapat melakukan hal berikut untuk menghindari peringatan.

public event EventHandler CanExecuteChanged { add{} remove{} }
Adam Mills
sumber
Jika saya melakukan ini, ia mengatakan nanti di file tempat saya melakukannya if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();"OnCompleteEvent tidak ada dalam konteks saat ini".
Almo
@Almo, itu benar. Namun, Anda menjelaskan kasus di mana Anda ARE menggunakan acara tersebut sehingga peringatan tidak akan muncul sehingga Anda tidak akan menggunakan perbaikan untuk peringatan tersebut. Baik? Biasanya Anda memiliki antarmuka yang menentukan acara dan dua subclass. Seseorang tidak menggunakan acara tersebut dan menggunakan solusi ini. Yang lain menggunakan acara tersebut dan tidak pernah memberikan peringatan untuk memulai.
Dirk Bester
Sudah terlalu lama, tetapi kami mendapatkan kesalahan ini meskipun sedang digunakan. Ada hubungannya dengan itu yang didefinisikan dengan cara yang menipu kompiler untuk berpikir itu tidak digunakan.
Almo
Terima kasih banyak atas solusi mudah untuk situasi yang sangat menjengkelkan ini!
M463
16

Cara terbaik kedua adalah imho untuk secara jelas menyatakan bahwa acara tersebut tidak didukung dengan memberikan pengecualian jika seseorang mencoba untuk berlangganan.

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

Sebagai varian dari ini, Anda juga dapat membiarkan metode adddan removekosong untuk mengabaikan langganan pada acara tersebut.

Solusi terbaik adalah dengan memfaktor ulang kode, mungkin menarik deklarasi kejadian ke pelaksana jika memungkinkan.

Sebagai upaya terakhir, Anda juga dapat menonaktifkan peringatan seperti itu

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
vidstige.dll
sumber
Saya tidak melihat bagaimana objek nol relevan di sini
vidstige
Saya tahu apa itu objek null, dan kasus penggunaan ini dibahas di paragraf terakhir. Harap baca seluruh jawaban dengan cermat.
vidstige
Saya tahu apa itu objek nol. Saya yakin kasus penggunaan ini tercakup dalam paragraf terakhir saya.
vidstige
3

Anda juga dapat melakukan hal berikut:

public event EventHandler MyEvent = delegate {}
GrantA
sumber
1

Kompilator tampaknya tidak menyadari bahwa ini digunakan dalam kode XAML. Coba tekan peringatan dalam definisi acara Anda.

Selain itu, pastikan Anda benar-benar mengangkat acara tersebut di suatu tempat.

SLaks
sumber
Itu juga yang saya pikirkan, jadi saya memindahkan kode XAML ke kode di belakang dan itu menunjukkan peringatan yang sama! Dan ya, saya 100% yakin acara ini diangkat di suatu tempat. Saya melihatnya dengan benar. Ini dihubungkan ke sebuah tombol.
jedmao
1

Anda dapat menekan peringatan individu.

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

Dalam hal ini, CS0219 adalah peringatan tentang variabel yang ditugaskan tetapi tidak digunakan. Anda dapat menggunakan flag / nowarn: 0219, atau menambahkan nomor kesalahan di panel properti untuk proyek tersebut (di bawah "Build", ingatlah untuk menghapus CS terkemuka). Ingatlah bahwa semua peringatan dari kelas ini ditekankan.

Svend
sumber
1

Atau Anda dapat menambahkan <NoWarn>67</NoWarn>proyek Anda

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>
Simon
sumber
9
ini akan menonaktifkan peringatan di seluruh proyek yang berpotensi menyembunyikan masalah nyata dengan peristiwa yang tidak digunakan.
vidstige