c# - CA2000 将对象引用传递给 C# 中的基本构造函数

标签 c# constructor code-analysis reliability ca2000

当我通过 Visual Studio 的代码分析实用程序运行某些代码时收到警告,我不确定如何解决。也许这里有人遇到过类似的问题并解决了它,并愿意分享他们的见解。

我正在对 DataGridView 控件中使用的自定义绘制单元格进行编程。代码类似于:

public class DataGridViewMyCustomColumn : DataGridViewColumn
{
    public DataGridViewMyCustomColumn() : base(new DataGridViewMyCustomCell())
    {
    }

它会生成以下警告:

CA2000:Microsoft.Reliability:在方法“DataGridViewMyCustomColumn.DataGridViewMyCustomColumn()”中,在对象“new DataGridViewMyCustomCell()”的所有引用超出范围之前调用 System.IDisposable.Dispose。

我知道这是在警告我 DataGridViewMyCustomCell(或其继承自的类)实现了 IDisposable 接口(interface),并且应该调用 Dispose() 方法来清理 DataGridViewMyCustomCell 不再声明的任何资源。

我在 Internet 上看到的示例建议使用 using block 来确定对象的生命周期并让系统自动处理它,但是当移入构造函数的主体时无法识别 base 所以我不能在它周围写一个 using block ......我不确定我是否想要这样做,因为这不会指示运行时释放该对象,该对象稍后仍可以在基类中使用吗?

那么我的问题是,代码可以吗?或者,如何重构它来解决警告?除非确实适合这样做,否则我不想取消警告。

最佳答案

如果您使用的是 Visual Studio 2010,则 CA2000 已完全损坏。它也可能在其他版本的 FxCop(又名代码分析)中被破坏,但 VS2010 是我唯一可以保证的。我们的代码库正在为这样的代码发出 CA2000 警告...

internal static class ConnectionManager 
{
    public static SqlConnection CreateConnection()
    {
         return new SqlConnection("our connection string");
    }
}

...表示连接在超出方法范围之前未被释放。好吧,是的,这是真的,但它并没有超出应用程序的范围,因为它返回给调用者 - 这就是该方法的全部意义所在!同样,您的构造函数参数不会超出范围,而是会传递给基类,因此这是规则的误报,而不是实际问题。

这曾经是一个有用的规则,但现在您真正能做的就是将其关闭,直到他们修复它。这很不幸,因为(很少)实际的积极因素是应该解决的问题。

关于c# - CA2000 将对象引用传递给 C# 中的基本构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2687398/

相关文章:

c# - 如何从数据库中选择最频繁的项目?

c# - XMLSerializer - 无参数构造

c# - 在对话框的构造函数中调用 .Show() 或 .ShowDialog 是一种好习惯

garbage-collection - 为什么 GC 不会自动处理我类(class)的成员?

code-analysis - 是否可以使用 SonarQube 实现类似 CAST 的分析?

c# - RestSharp android 上传多行

c# - 如何将此格式的 JSON 返回到字符串数组中

c# - FolderPicker 在 UWP Windows 10 应用程序(移动)中不起作用

java - 如何区分类的两个实例

c++ - 如何在没有警告的情况下在 gnu++11 标准中写入 "nested if...else statement for constants"?