Saat menggunakan ObsoleteAtribute di .Net, ini memberi Anda peringatan kompiler yang memberi tahu Anda bahwa objek / metode / properti sudah usang dan ada hal lain yang harus digunakan. Saat ini saya mengerjakan proyek yang membutuhkan banyak refactoring kode mantan karyawan. Saya ingin menulis atribut khusus yang dapat saya gunakan untuk menandai metode atau properti yang akan menghasilkan peringatan compiler yang memberikan pesan yang saya tulis. Sesuatu seperti ini
[MyAttribute("This code sux and should be looked at")]
public void DoEverything()
{
}
<MyAttribute("This code sux and should be looked at")>
Public Sub DoEverything()
End Sub
Saya ingin ini menghasilkan peringatan kompiler yang mengatakan, "Kode ini sux dan harus dilihat". Saya tahu cara membuat atribut khusus, pertanyaannya adalah bagaimana cara membuatnya menghasilkan peringatan kompiler di studio visual.
Jawaban:
Memperbarui
Ini sekarang dimungkinkan dengan Roslyn (Visual Studio 2015). Anda dapat membangun sebuah analyzer kode untuk memeriksa atribut khusus
Saya tidak percaya itu mungkin. ObsoleteAttribute diperlakukan secara khusus oleh kompilator dan didefinisikan dalam standar C #. Mengapa ObsoleteAttribute tidak dapat diterima? Bagi saya, sepertinya inilah situasi yang dirancang untuk itu, dan mencapai tepat apa yang Anda butuhkan!
Perhatikan juga bahwa Visual Studio mengambil peringatan yang dihasilkan oleh ObsoleteAttribute dengan cepat juga, yang sangat berguna.
Bukan bermaksud tidak membantu, hanya bertanya-tanya mengapa Anda tidak tertarik untuk menggunakannya ...
Sayangnya ObsoleteAttribute disegel (mungkin sebagian karena perlakuan khusus) sehingga Anda tidak dapat membuat subkelas atribut Anda sendiri darinya.
Dari standar C #: -
Bukankah itu meringkas kebutuhan Anda? ... Anda tidak akan melakukan lebih baik dari yang saya kira.
sumber
[Obsolete]
tag adalah karena dapat menyebabkan masalah jika Anda perlu melakukan XmlSerialization dengan properti tersebut. Menambahkan[Obsolete]
tag juga menambahkan[XmlIgnore]
atribut di balik layar.Ini patut dicoba.
Anda tidak dapat memperpanjang Usang, karena sudah final, tetapi mungkin Anda dapat membuat atribut Anda sendiri, dan menandai kelas tersebut sebagai usang seperti ini:
Kemudian saat Anda menandai metode Anda dengan atribut "MustRefactor", peringatan kompilasi akan ditampilkan. Ini menghasilkan peringatan waktu kompilasi, tetapi pesan kesalahan terlihat lucu, Anda harus melihatnya sendiri dan memilih. Ini sangat dekat dengan apa yang ingin Anda capai.
PEMBARUAN: Dengan kode ini Ini menghasilkan peringatan (tidak terlalu bagus, tapi saya rasa tidak ada yang lebih baik).
sumber
IDisposable
pada kelas yang sudah usang tersebut, itu berarti Anda dapat menggabungkan kode pengujian cerdik Anda dalam satuusing
blok. Seperti ini:using(new MustRefactor()){DodgyCode();}
. Kemudian Anda dapat menemukan semua penggunaan setelah selesai. Saya menggunakan ini sekarang keSleep
utas di dalam loop for yang saya butuhkan untuk memperlambat secara artifisial untuk tujuan debugging.Di beberapa kompiler, Anda dapat menggunakan #warning untuk mengeluarkan peringatan:
Di kompiler Microsoft, Anda biasanya dapat menggunakan pesan pragma:
Anda menyebutkan .Net, tetapi tidak menentukan apakah Anda memprogram dengan C / C ++ atau C #. Jika Anda memprogram dalam C #, Anda harus tahu bahwa C # mendukung format #warning .
sumber
Kami saat ini sedang melakukan banyak pemfaktoran ulang di mana kami tidak dapat langsung memperbaiki semuanya. Kami hanya menggunakan perintah preproc #warning di mana kami perlu kembali dan melihat kode. Ini muncul di keluaran kompiler. Saya tidak berpikir Anda dapat menerapkannya pada suatu metode, tetapi Anda dapat meletakkannya di dalam metode, dan itu masih mudah ditemukan.
sumber
Di VS 2008 (+ sp1) #warnings tidak ditampilkan dengan benar di Daftar Kesalahan setelah Solusi Bersihkan Soultion & Rebuild, tidak semuanya. Beberapa Peringatan hanya ditampilkan dalam Daftar Kesalahan setelah saya membuka file kelas tertentu. Jadi saya terpaksa menggunakan atribut khusus:
Jadi ketika saya menandai beberapa kode dengannya
Ini menghasilkan peringatan seperti ini:
Saya tidak bisa mengubah teks peringatan, 'Beberapa komentar' tidak ditampilkan Daftar Kesalahan. Tapi itu akan melompat ke tempat yang tepat dalam file. Jadi jika Anda perlu memvariasikan pesan peringatan tersebut, buatlah berbagai atribut.
sumber
Apa yang Anda coba lakukan adalah penyalahgunaan atribut. Sebaliknya gunakan Daftar Tugas Visual Studio. Anda dapat memasukkan komentar dalam kode Anda seperti ini:
Kemudian buka View / Task List dari menu. Daftar tugas memiliki dua kategori, tugas pengguna dan Komentar. Beralih ke Komentar dan Anda akan melihat semua // Todo: ada di sana. Mengklik dua kali pada TODO akan membuka komentar di kode Anda.
Al
sumber
Saya tidak berpikir Anda bisa. Sejauh yang saya tahu, dukungan untuk ObsoleteAttribute pada dasarnya di-hardcode ke dalam compiler C #; Anda tidak dapat melakukan hal serupa secara langsung.
Apa yang mungkin dapat Anda lakukan adalah menggunakan tugas MSBuild (atau acara pasca-pembuatan) yang menjalankan alat kustom terhadap rakitan yang baru saja dikompilasi. Alat kustom akan mencerminkan semua jenis / metode dalam perakitan dan menggunakan atribut kustom Anda, di mana ia dapat mencetak ke default System.Console atau kesalahan TextWriters.
sumber
Melihat sumber untuk ObsoleteAttribute , sepertinya tidak melakukan sesuatu yang khusus untuk menghasilkan peringatan kompiler, jadi saya akan cenderung menggunakan @ technophile dan mengatakan bahwa itu dikodekan dengan keras ke dalam kompiler. Apakah ada alasan mengapa Anda tidak ingin hanya menggunakan ObsoleteAttribute untuk menghasilkan pesan peringatan Anda?
sumber
Ada beberapa komentar yang menyarankan untuk memasukkan peringatan atau pragma. Karya usang dengan cara yang sangat berbeda! Menandai fungsi usang dari pustaka L, pesan usang muncul saat program memanggil fungsi tersebut meskipun program pemanggil tidak ada di pustaka L. Peringatan memunculkan pesan HANYA saat L dikompilasi.
sumber
Berikut adalah Implementasi Roslyn, sehingga Anda dapat membuat atribut Anda sendiri yang memberikan peringatan atau kesalahan dengan cepat.
Saya telah membuat atribut Type Called
IdeMessage
yang akan menjadi atribut yang menghasilkan peringatan:Untuk melakukan ini, Anda perlu menginstal Roslyn SDK terlebih dahulu dan memulai proyek VSIX baru dengan analyzer. Saya telah menghilangkan beberapa bagian yang kurang relevan seperti pesan, Anda dapat mengetahui cara melakukannya. Dalam penganalisis Anda, Anda melakukan ini
Tidak ada CodeFixProvider untuk ini, Anda dapat menghapusnya dari solusi.
sumber