为什么位图会引起规则CA2000,而图像不会

本文关键字:图像 CA2000 规则 位图 为什么 | 更新日期: 2023-09-27 18:04:39

有很多关于SO的问题,哀叹代码分析规则CA2000可能被VS2010过于严格地应用,但我似乎遇到了一个应该应用它的情况,但不是。

考虑以下代码:

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没有被处理(容易修复,把它放在另一个using块中),但它不会抱怨srcImage(它也有一个Dispose()方法,我从来没有调用)。有人知道为什么代码分析在这里没有抱怨吗?

为什么位图会引起规则CA2000,而图像不会

CA2000和类似/相关的CA2213 (DisposableFieldsShouldBeDisposed)和CA1001 (TypesThatOwnDisposableFieldsShouldBeDisposable)规则对于如何识别一次性物品的"所有权"是相当严格的。只有在使用实例构造函数直接在代码中创建实例时,它们才会认为您的代码是一次性实例的所有者。因为你使用图像。FromFile来创建srcImage的实例,该规则不将你的代码识别为所有者。

如果您不同意这个规则行为,您可能想要在https://connect.microsoft.com/visualstudio/feedback上创建一个bug报告。(如果您关心一次性字段规则,您可能希望在使用它时投票支持现有的https://connect.microsoft.com/VisualStudio/feedback/details/485291/typesthatowndisposablefieldsshouldbedisposable-rule-ca1001-is-too-permissive建议。)

好吧,它应该"抱怨srcImage"太,但我,它不会抱怨它,因为你是传递给DrawImage方法"gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));",所以它不是足够聪明,知道它不会被用于更多的动作后的方法返回,或者它可能假设你使用它在gr实例,将被处置。无论如何,你应该使用using srcImage就像你正在做的newImage,不要遵循代码分析。