当我通过 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/