首頁 > 後端開發 > C++ > C# 中處置多個物件時如何有效處理 CA2202 警告?

C# 中處置多個物件時如何有效處理 CA2202 警告?

Patricia Arquette
發布: 2025-01-23 11:11:09
原創
215 人瀏覽過

How to Effectively Handle CA2202 Warnings When Disposing of Multiple Objects in C#?

抑制可處置物件的 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 會警告 memoryStreamcryptoStream 被多次處置。為了解決這些警告,可以選擇抑制它們,如提供的解決方案所示:

<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板