C # - Secara selektif menekan peringatan usang kustom

212

Saya menggunakan Obsolete atribut (seperti yang baru saja disarankan oleh sesama programmer) untuk menampilkan peringatan jika metode tertentu digunakan.

Apakah ada cara untuk menekan peringatan yang mirip dengan CodeAnalysis ' SuppressMessage pada titik-titik di mana penggunaannya dibenarkan?

Ini perlu bekerja untuk [Obsolete("Some message")]yang menghasilkan peringatan 618 dan [Obsolete]atribut polos tanpa pesan yang menghasilkan peringatan 612.

Alex
sumber

Jawaban:

257

Gunakan #pragma warning disable:

using System;

class Test
{
    [Obsolete("Message")]
    static void Foo(string x)
    {
    }

    static void Main(string[] args)
    {
#pragma warning disable 0618
        // This one is okay
        Foo("Good");
#pragma warning restore 0618

        // This call is bad
        Foo("Bad");
    }
}

Kembalikan peringatan setelahnya sehingga Anda tidak akan kehilangan panggilan "buruk".

Jon Skeet
sumber
1
Ini hanya berfungsi jika saya tidak memberikan pesan dengan atribut Usang saya. Saya punya pesan seperti ini: [Usang ("Inilah sebabnya ini tidak boleh digunakan - gunakan XYZ sebagai gantinya.")]. Setelah saya memasukkan pesan, peringatan pragma menonaktifkan 612 berhenti bekerja dan saya mendapatkan peringatan. Apakah saya memerlukan ID kesalahan lain, mungkin?
Alex
2
Ditemukan - Nomor peringatan yang benar adalah 618 jika ada pesan di atribut Obsolete. Terima kasih!
Alex
2
Goodo - Saya telah menyesuaikan contoh saya untuk mencocokkan ini.
Jon Skeet
6
@ George: Anda dapat menemukannya di sini .
Jordão
3
Lihat jawaban saya tentang cara mendapatkan nomor peringatan / kesalahan di tempat pertama.
Aaron Thoma
131

The niat adalah untuk menonaktifkan peringatan bagi usang penggunaan , terlepas dari apakah konstruk ditandai dengan [Obsolete]atau [Obsolete("Message")]. Jadi gunakan CS0612 dan CS0618 :

#pragma warning disable 612, 618 

...

#pragma warning restore 612, 618 
Jordão
sumber
3
Perhatikan juga bahwa peringatan tidak terjadi jika penggunaan yang usang di kelas yang itu sendiri ditandai sebagai usang.
redcalx
3
Apakah ada cara untuk menonaktifkan kesalahan juga, seandainya Obsoleteditandai sebagai kesalahan?
Shimmy Weitzhandler
2
@ Shimmy: jika ditandai sebagai kesalahan, maka Anda harus memperbaikinya, tidak ada cara untuk menekan kesalahan. Ini mungkin masalah sintaksis, posting sebagai pertanyaan di situs ini, dan Anda pasti akan mendapatkan jawaban yang bagus.
Jordão
18

Inilah cara mendapatkan nomor peringatan / kesalahan di tempat pertama:

  1. Bangun kembali proyek Anda.
  2. Pergi ke jendela Output .
  3. Cari baris peringatan / kesalahan yang ingin Anda tekan.
    Sebagai contoh:
    C:\Users\Username\Documents\Visual Studio 2010\Projects\Projectname\Classname.cs(203,7): warning CS0162: Unreachable code detected
  4. Salin bagian nomor setelah " CS".
  5. Kemudian lanjutkan seperti yang dikatakan Jon Skeet .

(Lebih baik selalu melanjutkan seperti yang dikatakan Jon Skeet ...)

Aaron Thoma
sumber
9

Anda sedang mencari #pragmadirektif penonaktifan peringatan

Pada dasarnya Anda menambahkan perintah berikut di atas situs panggilan dalam file .cs.

#pragma warning disable 612
SomeMethodCall

612 adalah ID pesan kesalahan untuk memanggil metode usang

JaredPar
sumber
Ini hanya berfungsi jika saya tidak memberikan pesan dengan atribut Usang saya. Saya punya pesan seperti ini: [Usang ("Inilah sebabnya ini tidak boleh digunakan - gunakan XYZ sebagai gantinya.")]. Setelah saya memasukkan pesan, peringatan pragma menonaktifkan 612 berhenti bekerja dan saya mendapatkan peringatan. Apakah saya memerlukan ID kesalahan lain, mungkin?
Alex
2
Ditemukan - Nomor peringatan yang benar adalah 618 jika ada pesan di atribut Obsolete.
Alex