当我通过 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(使用前将#替换为@)