在继承 class 之前处理基础 class
Disposing base class before inherited class
我有两个 classes:
public abstract class UnitOfWorkBase: IDisposable { }
public sealed class UnitOfWorkSql: UnitOfWorkBase { }
导出class的Dispose
方法通常是这样的:
protected override void Dispose (bool disposing)
{
if (!this.Disposed)
{
if (disposing)
{
// Managed.
}
// Unmanaged.
this.Disposed = true;
}
base.Dispose(disposing);
}
我总是在方法的末尾看到对 base.Dispose(disposing)
的调用。但是,在最近的场景中,需要在派生 class 中的对象之前处理基 class 的对象,如下所示:
protected override void Dispose (bool disposing)
{
base.Dispose(disposing);
if (!this.Disposed)
{
if (disposing)
{
// Managed.
}
// Unmanaged.
this.Disposed = true;
}
}
我不确定这是否被视为不良做法。有什么需要注意的吗?
我认为你应该打破常规。而不是:
class BaseClass
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//dispose my resources
}
}
}
这样写:
class BaseClass
{
private void Dispose(bool disposing)
{
if (disposing)
{
//dispose my resources
DisposeManagedOverride();
}
CloseUnmanagedOverride();
}
protected virtual void DisposeManagedOverride() {}
protected virtual void CloseUnmanagedOverride() {}
}
这样您将确保资源释放的正确顺序。
我有两个 classes:
public abstract class UnitOfWorkBase: IDisposable { }
public sealed class UnitOfWorkSql: UnitOfWorkBase { }
导出class的Dispose
方法通常是这样的:
protected override void Dispose (bool disposing)
{
if (!this.Disposed)
{
if (disposing)
{
// Managed.
}
// Unmanaged.
this.Disposed = true;
}
base.Dispose(disposing);
}
我总是在方法的末尾看到对 base.Dispose(disposing)
的调用。但是,在最近的场景中,需要在派生 class 中的对象之前处理基 class 的对象,如下所示:
protected override void Dispose (bool disposing)
{
base.Dispose(disposing);
if (!this.Disposed)
{
if (disposing)
{
// Managed.
}
// Unmanaged.
this.Disposed = true;
}
}
我不确定这是否被视为不良做法。有什么需要注意的吗?
我认为你应该打破常规。而不是:
class BaseClass
{
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//dispose my resources
}
}
}
这样写:
class BaseClass
{
private void Dispose(bool disposing)
{
if (disposing)
{
//dispose my resources
DisposeManagedOverride();
}
CloseUnmanagedOverride();
}
protected virtual void DisposeManagedOverride() {}
protected virtual void CloseUnmanagedOverride() {}
}
这样您将确保资源释放的正确顺序。