CA2000将对象引用传递给C#中的基构造函数要解决这个问题。也许这里有人有类似的问题,解决了它,并想分享他们的见解。我正在编写DataGridView控件中使用的自定义绘制单元格。代码类似于:publicclassDataGridViewMyCustomColumn:DataGridViewColumn{publicDataGridViewMyCustomColumn():base(newDataGridViewMyCustomCell()){}它生成以下警告:CA2000:Microsoft.Reliability:Inmethod'DataGridViewMyCustomColumn.DataGridViewMyCustomColumn()',在在引用超出范围之前,在对象“newDataGridViewMyCustomCell()”上调用了对所有System.IDisposable.Dispose的引用。我知道它警告我DataGridViewMyCustomCell(或其继承自的类)实现了IDisposable接口,并且应该调用Dispose()方法来清理DataGridViewMyCustomCell声明的任何资源。我在互联网上看到的例子建议使用块来限制对象的生命周期并让系统自动处理它,但是当移入构造函数的主体时无法识别基,所以我不能写块使用块...我不确定你还想做什么,因为不会指示运行时释放仍可在基类中稍后使用的对象?我的问题是,代码可以吗?或者,如何重构以解决警告?我不想禁止警告,除非这样做真的很合适。如果您使用的是VisualStudio2010,CA2000会完全崩溃。它也可能在其他版本的FxCop(也称为代码分析)中被破坏,但VS2010是我唯一可以保证的。我们的代码库为这样的代码提供CA2000警告...}}...表示连接在超出方法范围之前未被处理。好吧,是的,这是真的,但它并没有超出应用程序的范围,因为它返回给调用者——这就是方法的全部意义所在!此外,您的构造函数参数不会超出范围,而是会传递给基类,因此这是对规则的误报,而不是实际问题。这曾经是一个有用的规则,但现在您所能做的就是将其关闭,直到它被修复。这很不幸,因为(很少)实际的积极因素是应该解决的问题。没有安全和优雅的方法让链式构造函数将新的IDisposable对象传递给底层构造函数,因为正如您所指出的,没有办法将链式构造函数调用包装在任何类型的tryfinally块中。有一种方法是安全的,但它并不优雅:定义一个实用方法,例如:internalstaticTVstoreAndReturn(refTRdest,TVvalue)whereTV:TR{dest=value;返回值;}让构造函数看到看起来像:protectedDataGridViewMyCustomColumn(refIDisposablecleaner):base(storeAndReturn(refcleaner,newDataGridViewMyCustomCell())){}需要新对象的代码必须调用公共静态工厂方法,该方法将在一个try/finally块调用相应的构造函数,它的主线会在它完成之前清空清洁器,如果它不为空,它的finally块将在清洁器上调用Dispose。如果每个子类都定义了一个类似的工厂方法,这种做法将确保即使在创建时间和封装对象暴露给客户端代码之间发生异常,新的IDisposable对象也会被释放。这种模式很难看,但我不确定是否有更好的其他模式可以保证正确性。以上就是C#学习教程:CA2000将对象引用传递给C#中的基本构造函数全部内容分享给大家。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
