关于VS2010可能过于严格地应用代码分析规则CA2000的事实,有很多问题,但我似乎遇到了应该应用它的情况,但事实并非如此。
请考虑以下代码:
Image srcImage = Image.FromFile(source);
Bitmap newImage = new Bitmap(newWidth, newHeight);
using (Graphics gr = Graphics.FromImage(newImage))
{
gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}
newImage.Save(destination, ImageFormat.Jpeg);
现在,如果我在Visual Studio 2010中运行代码分析,它会抱怨 newImage 没有处理(很容易修复,把它放在另一个使用块),但它没有抱怨 srcImage (它还有一个我从不调用的Dispose()方法)。有谁知道为什么Code Analysis不会在这里抱怨?
答案 0 :(得分:5)
CA2000和类似/相关的CA2213(DisposableFieldsShouldBeDisposed)和CA1001(TypesThatOwnDisposableFieldsShouldBeDisposable)规则对于如何识别一次性的“所有权”非常严格。如果使用实例构造函数直接在代码中创建实例,他们只会将您的代码视为一次性实例的所有者。由于您使用Image.FromFile为srcImage创建实例,因此该规则不会将您的代码识别为所有者。
如果您不同意此规则行为,则可能需要在https://connect.microsoft.com/visualstudio/feedback创建错误报告。 (如果您关心一次性字段规则,您可能希望在您使用现有https://connect.microsoft.com/VisualStudio/feedback/details/485291/typesthatowndisposablefieldsshouldbedisposable-rule-ca1001-is-too-permissive建议时投票。)
答案 1 :(得分:0)
那么它也应该“抱怨srcImage”,但我猜测它没有抱怨它因为你将它传递给DrawImage
方法“gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
“因此,要么知道在方法返回后它不会用于更多操作,或者它可能假设您在gr
实例中使用它将被处置,这要么是不够智能的。无论如何,您应该using
使用srcImage
,就像使用newImage
一样,并且不要遵循代码分析。