phi*_*131 1 c# memory idisposable base-class
可能重复:
正确使用IDisposable接口
我试图通过书籍,互联网和stackoverflow找到我的问题的实际答案,但到目前为止没有任何帮助我,所以希望我可以说明我的问题足够有意义.
一般来说,我总是找到与如何释放内存相同的基本用法,即约.如下,我确实理解代码本身:
public class MyClass : IDisposable
{
bool disposed = false;
public void Dispose()
{
if (!disposed)
{
Dispose(true);
GC.SuppressFinalize(this);
disposed = true;
}
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//free managed ressources
}
// free other ressources
}
~MyClass()
{
Dispose(false);
}
}
Run Code Online (Sandbox Code Playgroud)
它完全理解方法的工作方式.但现在我的问题是:为什么我们需要基类IDisposable?在此代码示例,我们定义了一个名为方法Dispose()
.当我到处读到该方法是IDisposable的一部分时,我们刚刚定义了该方法MyClass
,如果我们不实现基类IDisposable或者我错误的假设,这段代码仍然有用吗?
我对C#并不是全新的,但我仍然需要学习很多东西,所以希望有人可以带领我朝着正确的方向前进.我检查了另一篇同样问题的帖子,但找不到它,所以如果它确实存在且它确实回答了我的问题,请带我到那里,我将删除这篇文章.
你是对的,因为你的析构函数~MyClass
调用Dispose
,似乎不需要接口IDisposable
.
但是Dispose
只有析构函数才会调用它.当您希望处理非托管资源时,可以在代码中自己调用它.这是必需的,因为您不知道何时调用析构函数(由垃圾收集器决定).
最后,IDisposable.Dispose
当你使用a时调用using
.
using(MyDisposableClass myObject = new MyDisposableClass())
{
// My Code
}
Run Code Online (Sandbox Code Playgroud)
相当于:
MyDisposableClass myObject = new MyDisposableClass();
try
{
// My Code
}
finally
{
myObject.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1427 次 |
最近记录: |