我在浏览.NET Framework的源代码,试图了解其他的问题,我看到这个代码(PeerNearMe.cs
从System.Net.PeerToPeer.Collaboration
):设置字段值终于{}
private bool m_Disposed;
protected override void Dispose(bool disposing)
{
if (!m_Disposed){
try{
m_Disposed = true;
}
finally{
base.Dispose(disposing);
}
}
}
是否有任何理由将变量赋值放在try
区块中?可能会以例外的方式失败吗?起初,我认为这是因为即使线程被终止,最终也会被执行:Thread.Abort()
:
未完成的finally块在线程被中止之前执行。
在这种情况下我期望 try块包括所有方法中:
try {
if (!m_disposed)
m_disposed = true;
}
finally {
base.Dispose(disposing)
}
然而they也说:
调用中止可能会阻止如果线程正在中止的线程位于代码的受保护区域中,例如catch块,finally块或约束执行区。如果调用Abort的线程持有中止线程所需的锁定,则会发生死锁。
IMO调用基类的虚拟方法是点点在这种情况下跳跃在黑暗。
总之:该代码的这一点是什么?它真的试图实现什么?如果是因为Thread.Abort()
那么是不是错了?
编辑:如果它真的Thread.Abort()
只是因为那么如果if (!m_Disposed) {
之后,但之前try {
发生中止它不会做其工作。请注意,Dispose()
必须对多个呼叫具有弹性,并且无需执行任何操作(无论何时调用)。
反讽 - MSDN建议避免_和领域,他们匈牙利命名法已经在内部完成了。 – niksofteng
@dotnetkid,转换只是转换。只要整个组织遵循它,它就可以工作。 – qxg
也可能是这种情况,此代码的以前版本在'm_disposed = true;'语句之前有更多语句。而try/finally块只是一个剩余的。 –