抑制可处置对象的 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中文网其他相关文章!