Sekat amaran CA2202 untuk objek pakai buang
Alat analisis kod CA2202 membenderakan kemungkinan isu yang menyebabkan objek dilupuskan beberapa kali, yang berpotensi mengakibatkan ralat ObjectDisposedException
. Amaran ini biasanya berlaku apabila menggunakan objek pakai buang bersarang, seperti yang ditunjukkan dalam kod berikut:
<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>
Dalam kes ini, CA2202 akan memberi amaran bahawa memoryStream
dan cryptoStream
diproses beberapa kali. Untuk menyelesaikan amaran ini, anda boleh menyekatnya secara pilihan, seperti yang ditunjukkan dalam penyelesaian yang disediakan:
<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>
Penindasan menyediakan cara untuk mengesahkan bahawa amaran dianggap tidak penting atau tidak betul dalam konteks kod tertentu. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa kod itu secara teknikalnya masih melibatkan pelbagai pelupusan, yang boleh menyebabkan masalah jika pelaksanaan objek pakai buang gagal.
Selain penindasan, pendekatan lain ialah memfaktorkan semula kod untuk menghapuskan pelupusan tambahan dan memastikan setiap objek hanya dilupuskan sekali:
<code class="language-csharp">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>
Ini menghapuskan amaran tanpa mengorbankan tingkah laku yang dijangkakan atau memperkenalkan sebarang kemungkinan pengecualian. Walau bagaimanapun, pendekatan pilihan akhirnya bergantung pada keperluan khusus dan konteks asas kod anda.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Amaran CA2202 Dengan Berkesan Apabila Membuang Pelbagai Objek dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!