Umgang mit CA2202-Warnungen im kryptografischen C#-Code: Eine umfassende Anleitung
CA2202-Warnungen werden häufig bei der Entwicklung von Code mit Verschlüsselung angezeigt. Diese Warnungen weisen darauf hin, dass möglicherweise ein Problem mit der mehrfachen Freigabe von Objekten vorliegt, was zu einem System.ObjectDisposedException-Fehler führen kann. Um die Grundursache zu verstehen und solche Probleme zu beheben, schauen wir uns das bereitgestellte Code-Snippet an:
<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>
Mit Visual Studio Code Analysis angezeigte Warnmeldungen weisen auf ein Problem mit der möglichen mehrfachen Freigabe von „cryptoStream“ (Warnung 7) und „memoryStream“ (Warnung 8) hin. Der Grund für diese Warnungen liegt darin, dass beide Objekte in einer „using“-Anweisung enthalten sind, was darauf hinweist, dass sie automatisch freigegeben werden, wenn der innerste „using“-Block beendet wird.
In diesem Fall empfiehlt es sich, die Warnung zu unterdrücken. Code, der verfügbare Objekte verwaltet, sollte konsistent sein, und Entwickler sollten sich nicht unnötig Gedanken über mögliche mehrfache Entsorgungen machen, wenn andere Klassen diese Objekte besitzen und entsorgen können.
Um Warnungen zu unterdrücken, wenden Sie das Attribut [SuppressMessage] an:
<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>
Darüber hinaus heißt es in der IDisposable.Dispose-Dokumentation: „Wenn die Dispose-Methode eines Objekts mehrmals aufgerufen wird, muss das Objekt alle Aufrufe nach dem ersten Aufruf ignorieren. Wenn seine Dispose-Methode mehrmals aufgerufen wird, darf das Objekt keine Ausnahme auslösen.“ .“ Dies ermöglicht Entwicklern die sichere Verwendung von „using“-Anweisungen in kaskadierenden Entsorgungsszenarien, wie im geänderten Code gezeigt.
Zusammenfassend lässt sich sagen, dass die Unterdrückung von CA2202-Warnungen mithilfe des Attributs [SuppressMessage] eine pragmatische Lösung ist und gleichzeitig eine korrekte Entsorgungsimplementierung gewährleistet. Dieser Ansatz priorisiert die Konsistenz und Robustheit des Codes und vermeidet gleichzeitig unnötige Bedenken hinsichtlich mehrfacher Entsorgung.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit CA2202-Warnungen im C#-Verschlüsselungscode um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!