为什么Bitmap会导致规则CA2000,但Image不会?

Ale*_*x K 6 c# dispose code-analysis visual-studio-2010

关于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);
Run Code Online (Sandbox Code Playgroud)

现在,如果我在Visual Studio 2010中运行Code Analysis,它会抱怨newImage没有处理(很容易修复,把它放在另一个使用块),但是它没有抱怨srcImage(它也有Dispose()方法)我永远不会打电话).有谁知道为什么Code Analysis不会在这里抱怨?

Nic*_*oiu 5

CA2000和类似/相关的CA2213(DisposableFieldsShouldBeDisposed)和CA1001(TypesThatOwnDisposableFieldsShouldBeDisposable)规则对于如何识别一次性的"所有权"是相当严格的.如果使用实例构造函数直接在代码中创建实例,他们只会将您的代码视为一次性实例的所有者.由于您使用Image.FromFile为srcImage创建实例,因此该规则不会将您的代码识别为所有者.

如果您不同意此规则行为,则可能需要在https://connect.microsoft.com/visualstudio/feedback上创建错误报告.(如果您关心一次性字段规则,您可能希望投票支持现有的https://connect.microsoft.com/VisualStudio/feedback/details/485291/typesthatowndposposablefieldsshouldbedisposable-rule-ca1001-is-too-permissive advicetion对此.)


Jal*_*aid 0

好吧,它也应该“抱怨 srcImage”,但是我它不会抱怨它,因为你将它传递给方法DrawImagegr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));”,所以要么它不够聪明,不知道它不会被用于更多操作方法返回后,或者可能假设您在gr将被处置的实例中使用了它。无论如何,您应该像您正在做的那样使用usingsrcImage并且newImage不要遵循代码分析。