【发布时间】:2019-03-05 01:46:15
【问题描述】:
我不知道如何使用 Dispose/Finalize 方法处理包含变量的类。我希望这个类包含它自己的 Dispose/Finalize 方法,这些方法为每个变量调用 Dispose;但是,C# 文档和 StackOverflow 上的所有其他答案/示例都引起了一些混乱。
主要的混淆来自于对什么是“托管”或“非托管”对象没有明确说明。例如,解释如何实现 Dispose 的文档 here 仅使用占位符 cmets,它们仅声明“在此处释放任何非托管对象”。或“在此处释放任何其他托管对象。”
具有 Dispose/Finalize 的类变量是否属于托管或非托管类别? (此外,我是否应该担心不包含任何类型的 Dispose/Finalize 实现的类变量?考虑到有两种类型的“管理”,这是否意味着那些没有“Dispose”的变量仍然需要以某种方式处理?)
即,处理此类的正确方法是什么?
class BaseClass : IDisposable {
MyDisposeableObject disposeMe; // object with Dispose/Finalize
Dictionary<string,int> anotherObject; // just some arbitrary other object
bool disposed = false;
public BaseClass() {
disposeMe = new MyDisposeableObject();
anotherObject = new Dictionary<string,int>();
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing) {
if (disposed)
return;
if (disposing) {
// Free any other managed objects here.
// Should I use "disposeMe.Dispose()" here?
}
// Free any unmanaged objects here.
// OR should I use "disposeMe.Dispose()" here?
// Also should I be doing anything with "anotherObject"?
disposed = true;
}
~BaseClass() {
Dispose(false);
}
}
【问题讨论】:
标签: c# memory-management dispose finalize