抑制可處置物件的 CA2202 警告
程式碼分析工具 CA2202 會標記可能存在的問題,這些問題會導致多次處置對象,從而可能導致 ObjectDisposedException
錯誤。此警告通常在嵌套使用可處置物件時出現,如下面的程式碼所示:
<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>
在這種情況下,CA2202 會警告 memoryStream
和 cryptoStream
被多次處置。為了解決這些警告,可以選擇抑制它們,如提供的解決方案所示:
<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>
抑制提供了一種方法來確認在特定程式碼的上下文中,警告被認為是不重要的或不正確的。但是,需要注意的是,程式碼在技術上仍然涉及多次處置,如果可處置物件的實作出現故障,可能會導致問題。
除了抑制之外,另一種方法是重構程式碼以消除額外的處置,並確保每個物件只處置一次:
<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>
這消除了警告,而不會犧牲預期的行為或引入任何潛在的異常。但是,首選方法最終取決於程式碼庫的特定要求和上下文。
以上是C# 中處置多個物件時如何有效處理 CA2202 警告?的詳細內容。更多資訊請關注PHP中文網其他相關文章!