C# 抽象类层次结构中的IDisposable实现
我有以下的类层次结构-C# 抽象类层次结构中的IDisposable实现,c#,.net,abstract-class,idisposable,C#,.net,Abstract Class,Idisposable,我有以下的类层次结构- //Abstract Class1 in library1 (Can't modify this) public abstract class absClass1 : IDisposable { public abstract int AddTwoNumbers(int Num1, int Num2); // Some other overrides, abstract methods and concrete methods void Disp
//Abstract Class1 in library1 (Can't modify this)
public abstract class absClass1 : IDisposable
{
public abstract int AddTwoNumbers(int Num1, int Num2);
// Some other overrides, abstract methods and concrete methods
void Dispose()
{
// Standard Dispose impl.
}
}
//Abstract Class2 in library2
public abstract class absClass2 : absClass1
{
//Implementing AddTwoNumbers
public override int AddTwoNumbers(int Num1, int Num2)
{
return Num1+Num2;
}
public abstract int MultiplyTwoNumbers(int Num1, int Num2);
// Some other overrides, abstract methods and concrete methods
protected override void Dispose(bool disposing)
{
if (!IsDisposed)
{
//Cleanup
}
base.Dispose(disposing);
}
}
//Derived class from absClass2 in library3
public sealed class absDerived1 : absClass2
{
//Implementing MultiplyTwoNumbers
public override int MultiplyTwoNumbers(int Num1, int Num2)
{
return Num1*Num2;
}
// Some other overrides, abstract methods and concrete methods
protected override void Dispose(bool disposing)
{
if (!IsDisposed)
{
// Cleanup
}
base.Dispose(disposing);
}
}
//... Some more implementation of absClass2 like absDerived2 etc.
// can be there in other library4...
我想处理
absClass2
和absDerived
中的对象,在这两个类中重写dispose(bool)是否有问题?这个设计有什么问题吗?如何改进这一点 这是正确的,无论引用的类型如何,如果对象是absDervied
则一旦absClass1类Dispose()调用虚拟Dispose(bool)则调用引用上的Dispose()
将调用所有类上的Dispose
方法,直到absClass1
该方法(在absClass1
上)调用虚拟方法Dispose(bool)
,该方法调用派生度最高的方法(在absDerived
)base.Dispose(disposing)调用最近的基类(即absClass2
)上的方法,该方法还包含对base.Dispose(disposing)的调用
调用absClass1
上的方法
将该类结构放在控制台应用程序中,将一些WriteLine语句放在Dispose方法中,当调用Dispose()
时,您会看到它们都会触发。这目前不会编译,但由于您没有问为什么它不会编译,我猜您只是为了简洁起见省略了void Dispose()
定义
只要您正确地调用base.Dispose
,并且只担心处理当前类的本地内容而不是基类中的内容,这就可以了,因为您依赖base.Dispose
来为您执行此操作
调用base。
只调用当前类型的直接基类型,因此在您的情况下,absDerived
转到absClass2
,它转到absClass
我唯一的观察是,在调用
base.Dispose
之前,您需要小心处理当前类型的内容。根据内容之间的关系,您可能希望先处理基本内容,然后处理当前类型,但这完全取决于您实际处理的内容以及顺序是否重要。在何处执行GC.SuppressFinalize(this)@MAfifi,我不会使用GC.SuppressFinalize,因为我们没有使用任何析构函数,也不想自动执行Dispose调用,我们依赖于确保所有对象都显式地被释放。感谢Adam,是的,我故意离开Dispose(),它在Absclas1中。