ホームページ >バックエンド開発 >C++ >C# で複数のオブジェクトを破棄するときに CA2202 警告を効果的に処理する方法は?

C# で複数のオブジェクトを破棄するときに CA2202 警告を効果的に処理する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-23 11:11:09159ブラウズ

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 は

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>
抑制は、特定のコードのコンテキスト内で警告が重要でないか、または正しくないとみなされることを確認する方法を提供します。ただし、コードには技術的に複数の破棄が含まれているため、破棄可能なオブジェクトの実装が失敗した場合に問題が発生する可能性があることに注意することが重要です。

抑制に加えて、コードをリファクタリングして余分な破棄を排除し、各オブジェクトが 1 回だけ破棄されるようにするという別のアプローチもあります。

<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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。