CA2202,如何解决这种情况下, [英] CA2202, how to solve this case
问题描述
谁能告诉我如何从以下code所有CA2202警告?
公共静态byte []的加密(字符串数据,字节[]键,byte []的IV)
{
使用(MemoryStream的MemoryStream的=新的MemoryStream())
{
使用(DESCryptoServiceProvider密=新DESCryptoServiceProvider())
{
使用(CryptoStream的CryptoStream的=新的CryptoStream(的MemoryStream,cryptograph.CreateEncryptor(钥匙,四),CryptoStreamMode.Write))
{
使用(的StreamWriter StreamWriter的=新的StreamWriter(CryptoStream的))
{
streamWriter.Write(数据);
}
}
}
返回memoryStream.ToArray();
}
}
警告7 CA2202:Microsoft.Usage:对象'的CryptoStream可以设置一次以上方法CryptoServices.Encrypt(字符串,字节[],byte []的)'。为了避免产生System.ObjectDisposedException你不应该调用Dispose超过一次的对象上:行:34
警告8 CA2202:Microsoft.Usage:对象'的MemoryStream可以设置一次以上方法CryptoServices.Encrypt(字符串,字节[],byte []的)'。为了避免产生System.ObjectDisposedException你不应该调用Dispose一个以上的时间在一个对象:行:34,37
您需要的Visual Studio code的分析,看看这些警告(这些都不是C#编译器警告)。
这个编译没有警告:
公共静态byte []的加密(字符串数据,字节[]键,byte []的IV)
{
的MemoryStream MemoryStream的= NULL;
DESCryptoServiceProvider密= NULL;
CryptoStream的CryptoStream的= NULL;
的StreamWriter的StreamWriter = NULL;
尝试
{
MemoryStream的=新的MemoryStream();
密=新DESCryptoServiceProvider();
CryptoStream的=新的CryptoStream(的MemoryStream,cryptograph.CreateEncryptor(钥匙,四),CryptoStreamMode.Write);
VAR的结果= MemoryStream的;
MemoryStream的= NULL;
的StreamWriter =新的StreamWriter(CryptoStream的);
CryptoStream的= NULL;
streamWriter.Write(数据);
返回result.ToArray();
}
最后
{
如果(MemoryStream的!= NULL)
memoryStream.Dispose();
如果(密文!= NULL)
cryptograph.Dispose();
如果(CryptoStream的!= NULL)
cryptoStream.Dispose();
如果(StreamWriter的!= NULL)
streamWriter.Dispose();
}
}
修改回应的评论:
我只是再次验证了这code不会产生警告,而原来的一样。
在原来的code, CryptoStream.Dispose()
和的MemoryStream()的Dispose(
)的实际调用两次(其可以是或可以不是个问题)。
修改后的code的工作原理如下:引用设置为空
,只要负有责任的处理转移到另一个对象。例如。 的MemoryStream
设置为空
调用的CryptoStream
构造函数之后成功了。 的CryptoStream
设置为空
,调用的StreamWriter
之后构造成功。如果没有异常发生,的StreamWriter
设置在最后
块将依次部署的CryptoStream
和的MemoryStream
。
Can anybody tell me how to remove all CA2202 warnings from the following code?
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();
}
}
Warning 7 CA2202 : Microsoft.Usage : Object 'cryptoStream' can be disposed more than once in method 'CryptoServices.Encrypt(string, byte[], byte[])'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.: Lines: 34
Warning 8 CA2202 : Microsoft.Usage : Object 'memoryStream' can be disposed more than once in method 'CryptoServices.Encrypt(string, byte[], byte[])'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.: Lines: 34, 37
You need Visual Studio Code Analysis to see these warnings (these are not c# compiler warnings).
This compiles without warning:
public static byte[] Encrypt(string data, byte[] key, byte[] iv)
{
MemoryStream memoryStream = null;
DESCryptoServiceProvider cryptograph = null;
CryptoStream cryptoStream = null;
StreamWriter streamWriter = null;
try
{
memoryStream = new MemoryStream();
cryptograph = new DESCryptoServiceProvider();
cryptoStream = new CryptoStream(memoryStream, cryptograph.CreateEncryptor(key, iv), CryptoStreamMode.Write);
var result = memoryStream;
memoryStream = null;
streamWriter = new StreamWriter(cryptoStream);
cryptoStream = null;
streamWriter.Write(data);
return result.ToArray();
}
finally
{
if (memoryStream != null)
memoryStream.Dispose();
if (cryptograph != null)
cryptograph.Dispose();
if (cryptoStream != null)
cryptoStream.Dispose();
if (streamWriter != null)
streamWriter.Dispose();
}
}
Edit in response to the comments:
I just verified again that this code does not generate the warning, while the original one does.
In the original code, CryptoStream.Dispose()
and MemoryStream().Dispose(
) are actually called twice (which may or may not be a problem).
The modified code works as follows: references are set to null
, as soon as responsibilty for disposing is transferred to another object. E.g. memoryStream
is set to null
after the call to CryptoStream
constructor succeeded. cryptoStream
is set to null
, after the call to StreamWriter
constructor succeeded. If no exception occurs, streamWriter
is disposed in the finally
block and will in turn dispose CryptoStream
and MemoryStream
.
这篇关于CA2202,如何解决这种情况下,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!