c# - 为什么 Bitmap 会导致规则 CA2000,而 Image 不会?

标签 c# visual-studio-2010 dispose code-analysis

有很多关于 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 block 中),但它不会提示srcImage(它还有一个我从未调用过的 Dispose() 方法)。有谁知道为什么代码分析在这里不提示?

最佳答案

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 建议。)

关于c# - 为什么 Bitmap 会导致规则 CA2000,而 Image 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6973830/

相关文章:

c# - RestSharp 中的对象到 JSON 问题

c# - BindableProperty 通知属性改变

visual-studio-2010 - 如何为 .js 文件扩展 vs2010 编辑器上下文菜单?

visual-studio-2010 - $ git 审查 git : 'review' is not a git command. 见 'git --help'

c# - 如何释放/处置/销毁匿名方法中捕获的变量?

c# - 发送电子邮件通知的设计问题

c# - 使用 Linq 基于逗号分隔的属性值拆分 List<T>

c++ - Visual Studio 2010 编译器选项

flutter - 当小部件从窗口中删除时,不会调用 Dispose - Flutter

delphi - 处理指向复杂记录的指针