Tôi có đoạn code sauthực hiện IDisposable đúng cho mã này
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;
}
}
}
này hoạt động tốt, nhưng khi tôi chạy phân tích mã trên nó, nó đi kèm với thông báo sau
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.
As far như tôi đang quan tâm, khi GZipStream được Disposed, nó rời khỏi Stream (ms) nằm bên dưới, do tham số cuối cùng của hàm tạo (leftOpen = true).
Nếu tôi thay đổi mã của tôi hơi .. loại bỏ các 'sử dụng' khối xung quanh MemoryStream và thay đổi thông số '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;
}
}
này sau đó đi lên với ..
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.
Tôi không thể thắng .. (trừ khi tôi thiếu điều gì đó hiển nhiên) Tôi đã thử nhiều thứ khác nhau, như đặt thử/cuối cùng xung quanh khối, và Xử lý MemoryStream trong đó, nhưng có thể nói rằng tôi 'm xử lý nó hai lần, hoặc không phải ở tất cả !!
Thật lạ lùng. Từ [msdn docs] (http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx): [...] Dispose method [...] nên được gọi nhiều lần mà không cần ném một ngoại lệ (ObjectDisposedException)). – oleksii
CA2000 là một pita khổng lồ. Theo kinh nghiệm của tôi, nó tạo ra nhiều mặt tích cực hơn so với cảnh báo genuiune. Tất cả những gì [tiếng sói khóc] (http://en.wikipedia.org/wiki/The_Boy_Who_Cried_Wolf) bây giờ có nghĩa là tôi có xu hướng chỉ bỏ qua/ngăn chặn CA2000 bất cứ khi nào nó mọc lên. – LukeH
Bạn không thể thắng. Hãy sửa lỗi trong mã của bạn, gz cần Flush() hoặc đóng để tạo tất cả các byte. –