我在这里看到了一些关于如何在超出范围时处理对象的方法的帖子,但我尝试的任何东西似乎都没有用。
我有一个我创建的loadingscreen类,所以我在一个表单的xxx_load函数中声明了该对象。我希望对象在超出范围时自动处理,以便自动隐藏加载屏幕。
这是我的加载类
public class Loader : IDisposable
{
public Loader()
{
Form.Loadscreen();
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
Form.UnloadScreen();
}
}
以下是我在代码中使用它的方法。
using (Loader loader = new Loader())
{
//... do some loading processing
loader.Dispose();
}
即使我可以验证正在调用loader.Dispose(),仍然有时候没有处理对象。
有什么建议吗?
答案 0 :(得分:5)
首先,您无需明确调用loader.Dispose()
:这就是拥有using
块(它会自动调用Dispose
)背后的重点。
其次,你的意思是“对象没有被处理”,因为Dispose
被调用(并且不可能不会被调用; using
确保这一点。)
答案 1 :(得分:1)
无论如何只使用
using (Loader loader = new Loader())
{
//... do some loading processing
} // loader.Dispose(); will be called automatically. That's IDisposable() for!
答案 2 :(得分:0)
除了说IDisposable的答案和使用声明处理你的对象:
如果您正在观察任务管理器的内存占用情况,Dispose()
将不会使分配的内存量缩小。一种常见的误解是,在分配和释放内存的确切时刻,应用程序内存占用量会缩小和扩展。事实并非如此。虽然分配大块内存可能会使占用空间立即增加,但释放不会那样。
如果您仍然确信资源没有被释放,您可以尝试destructor。
然而,当你的申请 封装非托管资源 作为窗口,文件和网络 连接,你应该使用 析构者释放这些资源。 当对象符合条件时 破坏,垃圾收集器 运行Finalize方法 对象