2番目の信頼性警告に関しては、この状況が発生した場合、コード分析は、実行内容に関係なく、CA2000またはCA2202のいずれかで文句を言うようです。これについては複数の不満があります。これがあなたの楽しみのためのものです。
構文の使用に特有であるかどうかを確認するために、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からのメモがあります:
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();
}
}
}
}
これが機能することを嬉しく思いますが、同時に、ビットマップのコンストラクターで匿名のメモリストリームを使用するよりも少し醜いです。まぁ。