簡體   English   中英

如何滿足CA2202(不要多次丟棄對象)

[英]How to satisfy CA2202 (Do not dispose objects multiple times)

這個問題在您看來可能與CA2202重復,如何解決這個具有公認答案的案例 但是你可能會發現接受的答案有5張選票,因為質量很差。 此外,任何其他投票的答案實際上並不能解決問題。 他們中的大多數人都解釋了如何壓制規則或辯論這條規則是多么錯誤以及為什么我們應該忽略它。 由於那個規則存在,應該有一種方法來滿足它,我正在尋找社區支持來解決這個問題。

我試圖弄清楚如何在以下代碼中滿足CA2202 我理解這里的問題是, using語句還配置了encryptedStream對象。 但是如果我刪除了finally部分,它就會開始拋出CA2000

那么,編寫它以符合CA2202和CA2000的正確方法是什么

byte[] result;

MemoryStream encryptedStream = null;
try
{
    encryptedStream = new MemoryStream();
    using (var cryptStream = new CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write))
    {
        cryptStream.Write(inputInBytes, 0, inputInBytes.Length);
        cryptStream.FlushFinalBlock();
        result = encryptedStream.ToArray();
    }
}
finally
{
    encryptedStream?.Dispose();
}
string output = Convert.ToBase64String(result);

這是對您的問題的字面答案,因為它不會在不抑制它們的情況下發出CA警告,並且只會調用每個Dispose一次:

MemoryStream encryptedStream = null;
CryptoStream cryptStream = null;
try {
    encryptedStream = new MemoryStream();
    cryptStream = new CryptoStream(encryptedStream, cryptoTransform, CryptoStreamMode.Write);
    cryptStream.Write(inputInBytes, 0, inputInBytes.Length);
    cryptStream.FlushFinalBlock();
    result = encryptedStream.ToArray();
} finally {
    if (cryptStream != null) {
        cryptStream.Dispose();
   } else {
        if (encryptedStream != null) encryptedStream.Dispose();
   }
}
string output = Convert.ToBase64String(result);

但任何值得他們的鹽的開發者都應該看看這個,然后“嗯,就像他們不知道using ,我最好重寫一下”。 不要在生產代碼中執行此操作。 取消警告。 獲得這樣的代碼是正確的(並且在面對變化時保持正確)實際上比編寫using抑制虛假警告的代碼更難 (事實上​​,我不完全確定上面的代碼正確的!)。 它首先打破了靜態代碼分析的全部要點:編寫可靠的代碼。 您應該將代碼分析視為一種工具,而不是正確性的仲裁者。

真的,真的,壓制警告。 警告是錯誤的。 沒關系。 :-)

谷歌搜索“嵌套使用CA2202”,你會發現有關此問題的數十個stackoverflow和MSDN論壇帖子。 https://www.google.com/search?q=ca2202+nested+using

最終,CA2202和CA2000受到限制,因為它們無法理解嵌套的IDisposable對象的行為。 可以將某些流配置為使底層流保持打開狀態,但通常它們不會打開。 抑制確實是正確的解決方案。 問題是你正在努力成為一個好公民,所以你試圖遵守你所給出的警告。 但靜態分析並不足以處理這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM