相关疑难解决方法(0)

CA2202,如何解决这种情况

任何人都可以告诉我如何从以下代码中删除所有CA2202警告?

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

警告7 CA2202:Microsoft.Usage:对象'cryptoStream'可以在方法'CryptoServices.Encrypt(string,byte [],byte [])'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose:Lines:34

警告8 CA2202:Microsoft.Usage:对象'memoryStream'可以在方法'CryptoServices.Encrypt(string,byte [],byte [])'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose:Lines:34,37

您需要Visual Studio代码分析才能看到这些警告(这些不是c#编译器警告).

.net c# code-analysis fxcop

101
推荐指数
5
解决办法
3万
查看次数

为什么我不鼓励不止一次调用Dispose()?

这个问题描述了与CA2202相同的场景,如何解决这种情况,但它不是关于如何修复代码,而是关于为什么首先出现问题.

以下代码:

using (Stream stream = obtainStreamObject())
{
    using (var reader = new XmlTextReader(stream))
    {
        //do something with XmlTextReader
    }
}
Run Code Online (Sandbox Code Playgroud)

原因Stream.Dispose()叫两次.首先,内部using块会崩溃,这会调用XmlTextReader.Dispose()哪些调用Stream.Dispose().然后外部using块崩溃并Stream.Dispose()再次被调用.

所以,我必须换Streamusing,但不换行XmlTextReaderusing,尽管他们都实现IDisposable.

这会产生CA2202警告

不要多次处理对象对象'stream'可以在方法'MethodName(whatever)'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose.

好吧,它说第二个Dispose()可能会屈服ObjectDisposedException.这有什么意义?为什么我会这样实现Dispose(),当它第二次被调用它会抛出异常而不是什么都不做?

.net c# code-analysis idisposable using-statement

5
推荐指数
0
解决办法
414
查看次数

标签 统计

.net ×2

c# ×2

code-analysis ×2

fxcop ×1

idisposable ×1

using-statement ×1