我有以下代碼正確IDisposable的執行這段代碼
public static byte[] Compress(byte[] CompressMe)
{
using (MemoryStream ms = new MemoryStream())
{
using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress,true))
{
gz.Write(CompressMe, 0, CompressMe.Length);
ms.Position = 0;
byte[] Result = new byte[ms.Length];
ms.Read(Result, 0, (int)ms.Length);
return Result;
}
}
}
這工作得很好,但是當我在其上運行代碼分析,它具有以下消息
CA2202 : Microsoft.Usage : Object 'ms' can be disposed more than once in
method 'Compression.Compress(byte[])'. To avoid generating a
System.ObjectDisposedException you should not call Dispose more than one
time on an object.
就來了我的看法,當GZipStream佈置,它留下底層的流(MS)開放,由於構造函數(leaveOpen = TRUE)的最後一個參數。
如果我稍微改變我的代碼..去掉周圍的MemoryStream的「使用」塊,改變「leaveOpen」參數設置爲false ..
public static byte[] Compress(byte[] CompressMe)
{
MemoryStream ms = new MemoryStream();
using (GZipStream gz = new GZipStream(ms, CompressionMode.Compress, false))
{
gz.Write(CompressMe, 0, CompressMe.Length);
ms.Position = 0;
byte[] Result = new byte[ms.Length];
ms.Read(Result, 0, (int)ms.Length);
return Result;
}
}
這然後用..
CA2000 : Microsoft.Reliability : In method 'Compression.Compress(byte[])',
object 'ms' is not disposed along all exception paths. Call
System.IDisposable.Dispose on object 'ms' before all references to
it are out of scope.
來了
我贏不了。(除非我失去了一些東西明顯)我已經試過各種事情,就像把一個try /終於各地塊,並在那裏將MemoryStream的處置,但也不說,我處置它兩次,或根本不!
這是很奇怪的。從[msdn文檔](http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx):[...] Dispose方法應該多次調用而不會拋出異常(ObjectDisposedException )。 – oleksii
CA2000是一個巨大的皮塔餅。根據我的經驗,它比genuiune警告產生更多的誤報。所有[哭泣的狼](http://en.wikipedia.org/wiki/The_Boy_Who_Cried_Wolf)現在意味着我傾向於忽略/壓制CA2000。 – LukeH
你不能贏。在你的代碼中修正bug,gz需要Flush()或者關閉以產生所有的字節。 –