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

2023-11-25

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

我正在编写一个在 DataGridView 控件中使用的自定义绘制单元格。代码类似于:

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

它会生成以下警告:

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

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

我在互联网上看到的示例建议使用 using 块来确定对象的生命周期并让系统自动处理它,但是当移动到构造函数的主体中时,基类无法被识别,因此我无法编写 using阻止它......我不确定我是否想要这样做,因为这不会指示运行时释放仍可以在基类中稍后使用的对象吗?

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


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

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

...表明连接在超出方法范围之前未被释放。嗯,是的,确实如此,但这并不超出范围对于应用程序当它返回给调用者时 - 这就是该方法的全部要点!同样,构造函数参数不会超出范围,而是会传递给基类,因此这是规则的误报,而不是实际问题。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CA2000 将对象引用传递给 C# 中的基本构造函数 的相关文章

随机推荐

  • Sonar 4.2 分析同一项目中的 Java 和 JavaScript

    我正在尝试分析我的JEE项目与声纳4 2 它是多语言 JEE项目与Java and JS 我添加到我的插件声纳4 2 are Java 2 1 and JavaScript 1 6 最近 声纳添加了多语言分析 遵循doc 我已经删除了声纳语
  • 为什么 null std::Optional 被认为小于任何值,而不是更多

    null std Optional 小于任何保持值是否有任何数学意义 或者它只是为了一致性而设计的 如果它是 更多 而不是 更少 那么没有任何区别 直接来自提案 强调我的 已经提出了将脱离状态纳入比较的多种方法 所提出的那些经过精心设计 以
  • Android SearchView 不起作用

    我尝试更新所有库 但仍然出现错误 我可以在模拟器上运行该应用程序 但是当我导出 APK 并在真实的 Android 设备上运行它时 该应用程序无法运行 MinSdkVersion 为 8 targetSdkVersion 为 19 请帮忙
  • 在 C# 中实现对象的审计跟踪?

    我正在寻找有关如何在 C 中为我的对象实现审计跟踪的想法 对于当前项目 基本上我需要 存储给定对象的旧值和新值 记录新对象的创建 删除旧对象 有没有通用的方法可以做到这一点 比如使用 C 泛型 这样我就不必为基础对象的事件编写代码 例如创建
  • setBindingContext() 的用法是什么以及与元素绑定的区别?

    In the 1 5 2 3 定义绑定路径OpenUI5 demokit 部分 在聚合绑定的情况下 聚合的每个条目都存在上下文 或者可以使用 setBindingContext 方法为控件显式设置上下文 In the 1 5 3 3 元素绑
  • 创建包含另一个字符串的多个副本的字符串的最佳方法

    我想创建一个函数 它将接受一个字符串和一个整数作为参数 并返回一个包含重复给定次数的字符串参数的字符串 例如 std string MakeDuplicate const std string str int x Calling MakeD
  • 替换其他声明但没有其他声明存在?

    我的 AndroidManifest xml 文件如下所示
  • 如何使用 Ant 将数据文本文件包含在 jar 中?

    在我的 src 文件夹中 有另一个名为 data 的文件夹 其中包含文件 data1 txt 和 data2 txt 应用程序在初始化时从这些文件加载 图表 因此我想将这些文件包含在我的最终 jar 中 我使用 Ant 生成 jar 文件
  • PHP 当会话过期时做一些事情

    假设用户在我的网站上做了一些事情 例如上传了一些图像或其他内容 然后他没有注销就离开了 并且再也没有回来 或者假设他在几个月后确实回来了 所以我的问题是 是否有某种方法可以在会话过期后删除他上传的文件 比如说 30 分钟后 请记住用户从未重
  • 如何通过索引从字符串中获取字符?

    假设我有一个由 x 个未知字符组成的字符串 我怎样才能得到 char nr 13 或字符编号 x 14 首先确认需要的数量是有效索引对于从 begin 或 end 开始的字符串 那么您可以简单地使用数组下标表示法 使用len s 获取字符串
  • 如何从 C# 调用 MS Access 数据库宏

    我只是想知道是否可以从外部调用 MS Access 数据库中的模块函数或宏 使用C Thanks 是的 您可以运行宏 This Article 仅可通过 archive org 获取 显示您需要的一切
  • 我们如何计算处理时间?

    我创建了一个PopupPanel并已展示出来 我想在一分钟过去后隐藏它 在那一分钟内 该过程不应停止或暂停 我怎样才能实现这种行为 GWT 有自己的实现Timer 这是一个非常小的例子 public void onModuleLoad fi
  • 使用 Node.js 管理 sdk 创建令牌时的 Firebase REST 身份验证

    我知道这个问题在这里被问了很多 但我似乎仍然找不到可以解决我的问题的确切答案 我希望通过添加 access token 参数使用 REST 调用访问 Firebase access token 是使用 Node js Admin SDK 创
  • MICE 不会估算某些列,但也不会给出错误

    我知道以前曾问过类似的问题 例如 1 2 3 但我还是不明白为什么mice即使我尝试像示例中那样的无条件均值 也无法预测缺失值1 我的稀疏矩阵是 k1 k3 k5 k6 k7 k8 k11 k12 k13 k14 k15 1 NA NA N
  • 将单词(字符串)转换为 Int

    我确信这已经被做过一百次了 但我希望有一种非常简单的方法来完成这个任务 我想将单词更改为整数 就像下面的例子 One 1 Two 2 Three 3 所以基本上 如果我有字符串 One 它会转换为 1 即使我可以返回字符串 1 我也可以将其
  • Java:如何查看代码的哪些部分运行最多? (分析)

    我正在用 Java 编写一个简单的跳棋游戏 当我将鼠标悬停在主板上时 我的处理器性能提升至 50 核心上为 100 我想找出我的代码的哪一部分 假设是我的错 在此期间正在执行 我尝试过调试 但在这种情况下逐步调试效果不太好 有没有什么工具可
  • 获取当前正在运行的活动的实例?

    我想做的是将运动事件分派给当前正在运行的活动 我从这段代码中获取了当前活动的 ComponentName ActivityManager am ActivityManager getSystemService ACTIVITY SERVIC
  • 排除类型的重载的类型注释(某些类型与其他类型)

    我正在尝试使用 overload传达调用函数的不同方式 但是通过简单的代码可以轻松传达什么else声明在类型注释中是不可能的 如果没有 else MyPy 正确地 会抱怨重载版本不匹配 例如 请参见下面的代码片段 error Overloa
  • 错误 X3000:着色器文件中存在非法字符

    我粘贴了一行着色器代码 现在我的项目无法工作 我删除了受污染的代码行 我已经按照 VS Notepad 和 Notepad 的建议从头开始多次重写着色器Unity 论坛 我在 Notepad 中使用了十六进制编辑器视图来排除前两个字节不是0
  • CA2000 将对象引用传递给 C# 中的基本构造函数

    当我通过 Visual Studio 的代码分析实用程序运行一些代码时 我收到一条警告 我不确定如何解决 也许这里有人遇到过类似的问题 解决了它 并愿意分享他们的见解 我正在编写一个在 DataGridView 控件中使用的自定义绘制单元格