经常看到如果实现了xx接口,就会成为某种特定的类型,而拥有某些功能。比如icomponent接口是所有组件类的接口,提供所有组件需要的功能,但我用
Implements System.ComponentModel.IComponent 实现这个接口,就2个dispose方法和一个属性
Public Property Site() As System.ComponentModel.ISite Implements System.ComponentModel.IComponent.Site
Get End Get
Set(ByVal value As System.ComponentModel.ISite) End Set
End Property这就是能实现所有组件所需功能的一个属性?有点迷糊,关于实现接口而拥有某种功能在脑子里不能形成轮廓,谁能帮忙指点一二
Implements System.ComponentModel.IComponent 实现这个接口,就2个dispose方法和一个属性
Public Property Site() As System.ComponentModel.ISite Implements System.ComponentModel.IComponent.Site
Get End Get
Set(ByVal value As System.ComponentModel.ISite) End Set
End Property这就是能实现所有组件所需功能的一个属性?有点迷糊,关于实现接口而拥有某种功能在脑子里不能形成轮廓,谁能帮忙指点一二
If disposing Then
' TODO: put code to dispose managed resources
End If这里明明啥都没写,为什么不提供现实代码接口就能工作了呢?? Implements IDisposable Private disposed As Boolean = False ' IDisposable
Private Overloads Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
' TODO: put code to dispose managed resources
End If ' TODO: put code to free unmanaged resources here
End If
Me.disposed = True
End Sub#Region " IDisposable Support "
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Overloads Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub Protected Overrides Sub Finalize()
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(False)
MyBase.Finalize()
End Sub
利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销。
IDisposable接口提供了一种机制,允许类的用户控制释放资源的时间,但需要确保执行Dispose()。
一般情况下,最好的方法是执行这两种机制,获得这两种机制的优点,克服其缺点。假定大多数程序员都能正确调用Dispose(),实现IDisposable接口,同时把析构函数作为一种安全的机制,以防没有调用Dispose()。下面是一个双重实现的例子可以看出,Dispose()有第二个protected重载方法,它带一个bool参数,这是真正完成清理工作的方法。Dispose(bool)由析构函数和IDisposable.Dispose()调用。这个方式的重点是确保所有的清理代码都放在一个地方。传递给Dispose(bool)的参数表示Dispose(bool)是由析构函数调用,还是由IDisposable.Dispose()调用——Dispose(bool)不应从代码的其他地方调用,其原因是:● 如果客户调用IDisposable.Dispose(),该客户就指定应清理所有与该对象相关的资源,包括托管和非托管的资源。● 如果调用了析构函数,在原则上,所有的资源仍需要清理。但是在这种情况下,析构函数必须由垃圾收集器调用,而且不应访问其他托管的对象,因为我们不再能确定它们的状态了。在这种情况下,最好清理已知的未托管资源,希望引用的托管对象还有析构函数,执行自己的清理过程。isDispose成员变量表示对象是否已被删除,并允许确保不多次删除成员变量。这个简单的方法不是线程安全的,需要调用者确保在同一时刻只有一个线程调用方法。要求客户进行同步是一个合理的假定,在整个.NET类库中反复使用了这个假定(例如在集合类中)。第15章将讨论线程和同步。最后,IDisposable.Dispose()包含一个对System.GC. SuppressFinalize()方法的调用。SuppressFinalize()方法则告诉垃圾收集器有一个类不再需要调用其析构函数了。因为Dispose()已经完成了所有需要的清理工作,所以析构函数不需要做任何工作。调用SuppressFinalize()就意味着垃圾收集器认为这个对象根本没有析构函数public class ResourceHolder : IDisposable
{
private bool isDispose = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
//释放托管资源
}
//释放非托管资源
}
isDisposed=true;
} ~ResourceHolder()
{
Dispose (false);
}
}
' TODO: put code to dispose managed resources
End If
=============================================这里是留下来让你自己写代码是放托管资源