|
|
1
5
从终结器调用虚拟方法/
一些人对标准的一次性模式和虚拟方法的使用感到困惑,
下面是处理类型为的对象时发生的情况
现在,大多数运行此代码的人都会做一件事来修复它--他们移动
我不是说你不应该,
曾经
文件
那个虚拟方法是
它从不使用在下面派生的任何类中定义的任何状态
|
|
|
2
1
原因比任何事情都更实际:虚拟方法可以通过重写器选择的任何方式进行重写,例如,在构造过程中进行对象初始化, 以免最终得到具有随机空值和无效状态的对象。 |
|
3
1
我不认为有任何反对调用虚拟方法的建议。您记住的禁止可能是禁止在终结器中引用托管对象的规则。 在.Net文档中定义了一个标准模式,用于说明如何实现Dispose()。这种模式设计得很好,应该严格遵循。
当Dispose(bool)被传递值false时,这表示终结器已调用Dispose方法。在这种情况下,只应尝试清理非托管对象(某些罕见情况除外)。这是因为垃圾收集器刚刚调用了finalize方法,因此当前对象必须已标记为准备完成。因此,它引用的任何对象也可能被标记为已读以进行终结,并且由于序列是非确定性的,因此终结可能已经发生。
|
|
|
4
0
为了扩展Jon的答案,如果需要在该级别处理资源,那么应该重写子类上的dispose或析构函数,而不是调用虚拟方法。 尽管如此,我不相信这里有关于行为的“规则”。但一般的想法是,您希望在该实现级别将资源清理仅隔离到该实例。 |