C# 暗号化コードでの CA2202 警告の処理: 包括的なガイド
CA2202 警告は、暗号化を伴うコードを開発するときによく発生します。これらの警告は、オブジェクトが複数回解放されると問題が発生し、System.ObjectDissolvedException エラーが発生する可能性があることを示しています。根本原因を理解し、そのような問題を解決するために、提供されたコード スニペットを詳しく見てみましょう:
<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>
Visual Studio コード分析を使用して表示される警告メッセージは、「cryptoStream」 (警告 7) および「memoryStream」 (警告 8) が複数回解放される可能性がある問題を強調しています。これらの警告が表示される理由は、両方のオブジェクトが「using」ステートメント内に含まれており、最も内側の「using」ブロックが終了すると自動的に解放されることを示しているためです。
この場合、警告を抑制することをお勧めします。使い捨てオブジェクトを管理するコードは一貫している必要があり、開発者は、他のクラスがこれらのオブジェクトを所有して破棄できる場合に、複数の破棄が行われる可能性について不必要に心配すべきではありません。
警告を抑制するには、[SuppressMessage] 属性を適用します:
<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>
さらに、IDisposable.Dispose ドキュメントには、「オブジェクトの Dispose メソッドが複数回呼び出された場合、オブジェクトは最初の呼び出し以降のすべての呼び出しを無視する必要があります。その Dispose メソッドが複数回呼び出された場合、オブジェクトは例外をスローしてはなりません」と記載されています。これにより、変更されたコードに示されているように、開発者はカスケード破棄シナリオで "using" ステートメントを安全に使用できるようになります。
要約すると、[SuppressMessage] 属性を使用して CA2202 警告を抑制することは、適切な破棄の実装を保証しながら実用的な解決策です。このアプローチでは、複数の破棄に関する不要な懸念を回避しながら、コードの一貫性と堅牢性を優先します。
以上がC# 暗号化コードで CA2202 警告を処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。