关于第二个可靠性警告,似乎当这种情况发生时,无论您做什么,代码分析都会向 CA2000或CA2202 抱怨。对此有很多抱怨,这里有一个供您欣赏。
只是为了看看它是否特别适用于 using 语法,我将 using 扩展为 try catch 块,您会得到相同的行为。
class Program
{
static void Main(string[] args)
{
byte[] data = {};
//using (Bitmap bitmap = new Bitmap(new MemoryStream(data)))
//{ }
MemoryStream mem = null;
Bitmap bitmap = null;
try
{
mem = new MemoryStream(data);
bitmap = new Bitmap(mem);
}
catch (Exception)
{
throw;
}
finally
{
if (null!= bitmap ) bitmap.Dispose();
// commenting this out will provoke a CA2000.
// uncommenting this will provoke CA2202.
// so pick your poison.
// if (null != mem) mem.Dispose();
}
}
}
编辑:正如您(Jaska)所指出的,Microsoft 有一条关于在位图的 using 块中标记有关内存流的意图的说明:
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1000];
MemoryStream mem = null;
try
{
mem = new MemoryStream(data);
using (Bitmap bmp = new Bitmap(mem))
{
mem = null; // <-- this line will make both warning go away
}
}
finally
{
if (mem != null)
{
mem.Dispose();
}
}
}
}
我很高兴看到这行得通,但同时它比在位图的构造函数中使用匿名内存流有点难看。呃,好吧。