Mengendalikan amaran CA2202 dalam kod kriptografi C#: Panduan komprehensif
Amaran CA2202 sering ditemui semasa membangunkan kod yang melibatkan penyulitan. Amaran ini menunjukkan bahawa mungkin terdapat masalah dengan objek dikeluarkan beberapa kali, yang mungkin mengakibatkan ralat System.ObjectDisposedException. Untuk memahami punca dan menyelesaikan isu sedemikian, mari kita gali coretan kod yang disediakan:
<code class="language-csharp">public static byte[] Encrypt(string data, byte[] key, byte[] iv) { using(MemoryStream memoryStream = new MemoryStream()) { using (DESCryptoServiceProvider cryptograph = new DESCryptoServiceProvider()) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptograph.CreateEncryptor(key, iv), CryptoStreamMode.Write)) { using(StreamWriter streamWriter = new StreamWriter(cryptoStream)) { streamWriter.Write(data); } } } return memoryStream.ToArray(); } }</code>
Mesej amaran yang dipaparkan menggunakan Analisis Kod Visual Studio menyerlahkan isu dengan kemungkinan pembebasan berbilang "cryptoStream" (amaran 7) dan "memoryStream" (amaran 8). Sebab amaran ini muncul ialah kedua-dua objek terkandung dalam pernyataan "menggunakan", yang menunjukkan bahawa ia akan dikeluarkan secara automatik apabila blok "menggunakan" paling dalam keluar.
Dalam kes ini adalah disyorkan untuk menyekat amaran. Kod yang mengurus objek pakai buang hendaklah konsisten dan pembangun tidak perlu bimbang tentang kemungkinan pelupusan berbilang apabila kelas lain boleh memiliki dan melupuskan objek ini.
Untuk menyekat amaran, gunakan atribut [SuppressMessage]:
<code class="language-csharp">[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")] public static byte[] Encrypt(string data, byte[] key, byte[] iv) { using (var memoryStream = new MemoryStream()) { using (var cryptograph = new DESCryptoServiceProvider()) using (var cryptoStream = new CryptoStream(memoryStream, cryptograph.CreateEncryptor(key, iv), CryptoStreamMode.Write)) using (var streamWriter = new StreamWriter(cryptoStream)) { streamWriter.Write(data); } return memoryStream.ToArray(); } }</code>
Selain itu, dokumentasi IDisposable.Dispose menyatakan, "Jika kaedah Dispose objek dipanggil berbilang kali, objek mesti mengabaikan semua panggilan selepas panggilan pertama. Jika kaedah Dispose dipanggil beberapa kali, objek tidak boleh membuang pengecualian. ." Ini Membenarkan pembangun menggunakan pernyataan "menggunakan" dengan selamat dalam senario pelupusan bertingkat, seperti yang ditunjukkan dalam kod yang diubah suai.
Ringkasnya, menyekat amaran CA2202 menggunakan atribut [SuppressMessage] ialah penyelesaian pragmatik sambil memastikan pelaksanaan pelupusan yang betul. Pendekatan ini mengutamakan ketekalan dan keteguhan kod sambil mengelakkan kebimbangan yang tidak perlu tentang pelbagai pelupusan.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Amaran CA2202 dalam Kod Penyulitan C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!