Saya memiliki file HTTPSystemDefinitions.cs dalam proyek C # yang pada dasarnya menjelaskan ISAPI windows yang lebih lama untuk dikonsumsi oleh kode yang dikelola.
Ini termasuk seluruh Struktur yang relevan dengan ISAPI tidak semua atau yang dikonsumsi oleh kode. Saat kompilasi, semua anggota lapangan dari struktur ini menyebabkan peringatan seperti berikut: -
Bidang Peringatan 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' tidak pernah ditetapkan, dan akan selalu memiliki nilai default null
atau
Peringatan Bidang 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' tidak pernah digunakan
Bisakah ini dinonaktifkan dengan #pragma warning disable
? Jika demikian, apa angka kesalahan yang sesuai? Jika tidak, apakah ada hal lain yang bisa saya lakukan? Ingatlah bahwa saya hanya melakukan apa ini untuk file ini, yang penting saya mendapatkan peringatan seperti ini datang dari file lain.
Edit
Contoh struct: -
struct HTTP_FILTER_PREPROC_HEADERS
{
//
// For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
// Header names should include the trailing ':'. The special values
// 'method', 'url' and 'version' can be used to retrieve the individual
// portions of the request line
//
internal GetHeaderDelegate GetHeader;
internal SetHeaderDelegate SetHeader;
internal AddHeaderDelegate AddHeader;
UInt32 HttpStatus; // New in 4.0, status for SEND_RESPONSE
UInt32 dwReserved; // New in 4.0
}
sumber
[StructLayout(LayoutKind.Sequential)]
memastikan tata letak memori sudah benar (dalam implementasi saat ini bahkan tanpa atribut ini, tetapi AFAIK tidak dijamin). Jika saya ingat dengan benar, kompilator C # mendeteksi keberadaan atribut ini dan secara otomatis menyembunyikan peringatan tersebut karena ia tahu bahwa bidang harus ada di sana untuk interop. (Saya bisa saja salah tentang ini, karenanya memposting sebagai komentar, bukan jawaban).StructLayout
. Tampaknya lebih bersih daripada menekan peringatan itu sendiri.Jawaban:
Ya, ini bisa ditekan.
Biasanya, saya menentang untuk menyembunyikan peringatan, tetapi dalam kasus ini, struct yang digunakan untuk interop benar-benar membutuhkan beberapa bidang untuk ada, meskipun Anda tidak pernah bermaksud (atau dapat) menggunakannya, jadi dalam hal ini saya pikir itu harus dibenarkan .
Biasanya, untuk menyembunyikan kedua peringatan tersebut, Anda akan memperbaiki kode yang melanggar. Yang pertama ("... tidak pernah digunakan") biasanya merupakan kode-bau sisa dari versi kode sebelumnya. Mungkin kode telah dihapus, tetapi bidang tertinggal.
Yang kedua biasanya merupakan kode-bau untuk bidang yang salah digunakan. Misalnya, Anda mungkin salah menulis nilai baru sebuah properti kembali ke properti itu sendiri, tidak pernah menulis ke bidang backing.
Untuk menyembunyikan peringatan untuk " Bidang XYZ tidak pernah digunakan ", Anda melakukan ini:
Untuk menyembunyikan peringatan untuk " Bidang XYZ tidak pernah ditetapkan, dan akan selalu memiliki nilai default XX ", Anda melakukan ini:
Untuk menemukan sendiri nomor peringatan tersebut (yaitu, bagaimana saya tahu cara menggunakan 0169 dan 0649), Anda melakukan ini:
Salin kode peringatan 4 digit dari pesan yang relevan, yang akan terlihat seperti ini:
Peringatan : Sesuai komentar oleh @Jon Hanna , mungkin ada beberapa peringatan untuk hal ini, bagi para penemu pertanyaan dan jawaban ini di masa mendatang.
#pragma warning disable XYZK
,, menonaktifkan peringatan untuk sisa file itu , atau setidaknya sampai yang sesuai#pragma warning restore XYZK
ditemukan. Minimalkan jumlah baris tempat Anda menonaktifkan peringatan ini. Pola di atas menonaktifkan peringatan hanya untuk satu baris.sumber
//exists for interop
di kasus ini.[StructLayout(LayoutKind.Sequential)]
atribut menangani interop jauh lebih baik sesuai komentar Greg Beech tentang pertanyaan itu."Solusi" lain untuk memperbaiki peringatan ini adalah dengan membuat struct
public
. Peringatan tidak dikeluarkan karena kompilator tidak dapat mengetahui apakah bidang sedang digunakan (ditetapkan) di luar rakitan.Yang mengatakan, komponen "interop" biasanya tidak publik, melainkan
internal
atauprivate
.sumber
struct
yangpublic
lebih mungkin untuk menjadi kesalahan daripada peringatan kita mencoba untuk menutupi. (Anda mungkin tidak boleh mengekspos tipe yang digunakan untuk implementasi internal dan tipe dengan field publik yang mungkin tidak termasuk dalam API publik). Hanya untuk memperkuat saran Anda bahwa tipe seperti itu harus "lebih baikinternal
atauprivate
" ;-).JsonConvert.DeserializeObject
dan saya melakukan deserialisasi ke kelas publik yang semua propertinya terekspos sehingga saya tahu apa yang akan dikembalikan. Hanya menjadikannya kelas publik yang kosong dengan semua string publik adalah kode pendek yang bagus dan sekarang tidak ada lagi peringatan. Mungkin menggunakan kelas dinamis akan lebih baik karena Anda tidak perlu secara eksplisit menyatakan apa yang ada di dalam array, tetapi saya pikir ini akan menjadi referensi yang bagus bagi siapa pun yang berharap untuk menggunakan objek tersebut.Saya mendapat VS untuk menghasilkan kerangka implementasi
System.ComponentModel.INotifyPropertyChanged
dan kejadian diimplementasikan sebagai bidang yang memicu peringatan CS0067.Sebagai alternatif dari solusi yang diberikan dalam jawaban yang diterima, saya mengubah bidang menjadi properti dan peringatan menghilang .
Ini masuk akal karena gula sintaks deklarasi properti dikompilasi ke dalam bidang plus metode pengambil dan / atau penyetel (tambahkan / hapus dalam kasus saya) yang mereferensikan bidang tersebut. Ini memenuhi kompilator dan peringatan tidak dimunculkan:
sumber
<GetHeader>k__BackingField
, bergantung pada detail implementasi dari compiler C # yang digunakan.Pengguna C / C ++ harus
(void)var;
menyembunyikan peringatan variabel yang tidak digunakan. Saya baru saja menemukan Anda juga dapat menekan peringatan variabel yang tidak digunakan di C # dengan operator bitwise:Kedua ekspresi tidak menghasilkan peringatan variabel yang tidak digunakan di kompiler VS2010 C # 4.0 dan Mono 2.10.
sumber
uint
, tetapi tidak untuk jenis lain, sepertiException
. Apakah Anda mengetahui trik umum yang setara dengan C / C ++var;
?error.ToString();
untuk variabel tipeException