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

前端 未结 2 1002
耶瑟儿~
耶瑟儿~ 2020-12-19 21:22

This question may seem to you duplicate of CA2202, how to solve this case which has an accepted answer. But you may realize that accepted answer has 5 down v

2条回答
  •  太阳男子
    2020-12-19 21:53

    This is a literal answer to your question, in that it will not issue CA warnings without suppressing them, and will only ever call every Dispose once:

    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);
    

    But any developer worth their salt should take a look at this and go "hmm, it's like they didn't know using, I'd better rewrite that". Do not do this in production code. Suppress the warning. Getting code like this correct (and having it remain correct in the face of changes) is actually harder than writing code that uses using with suppression of spurious warnings (indeed, I'm not entirely sure the above code is correct!). It defeats the entire point of having static code analysis in the first place: to write reliable code. You should see code analysis as a tool, not an arbiter of correctness.

提交回复
热议问题