我有一个包装DbConnection的名为DatabaseHelper的类。为using语句设置此类的正确方法是什么?我已经实现了IDisposible,但我不确定应该在何时何地调用Connection.Close()或Connection.Dispose()。
当我只是在自己的Dispose()方法中调用Connection.Dispose()时,有时会从我的DbConnection对象中获得一个SocketException。我认为这是因为旧的连接是开放的,但没有附加到异常的细节,所以我不能确定。
发布于 2008-12-22 17:13:09
从dispose方法中调用connection.Dispose()。您应该看看实现IDisposable的标准模式,它超越了简单地实现IDisposable接口,并允许部署非托管对象等:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Dispose managed resources.
}
// There are no unmanaged resources to release, but
// if we add them, they need to be released here.
}
disposed = true;
// If it is available, make the call to the
// base class's Dispose(Boolean) method
base.Dispose(disposing);
}(摘自http://msdn.microsoft.com/en-us/library/system.idisposable.aspx)。
发布于 2008-12-22 17:18:33
据this新闻组报道:
下面是IDbConnection.Dispose()的实现方式(如反射器工具所示):
SqlClient:
protected override void Dispose(bool disposing)
{
if (disposing)
{
switch (this._objectState)
{
case ConnectionState.Open:
{
this.Close();
break;
}
}
this._constr = null;
}
base.Dispose(disposing);
}
Odbc:
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._constr = null;
this.Close();
CNativeBuffer buffer1 = this._buffer;
if (buffer1 != null)
{
buffer1.Dispose();
this._buffer = null;
}
}
base.Dispose(disposing);
}
OleDb:
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (this.objectState != 0)
{
this.DisposeManaged();
if (base.DesignMode)
{
OleDbConnection.ReleaseObjectPool();
}
this.OnStateChange(ConnectionState.Open, ConnectionState.Closed);
}
if (this.propertyIDSet != null)
{
this.propertyIDSet.Dispose();
this.propertyIDSet = null;
}
this._constr = null;
}
base.Dispose(disposing);
}dispose方法应仅在连接处于打开状态时尝试关闭该连接。
发布于 2013-07-04 16:11:51
这个析构函数语法实际上就是终结器。终结器正在调用Dispose(false)方法。
#region IDisposable Members
private bool _isDisposed;
private void ThrowIfDisposed()
{
if (_isDisposed)
throw new ObjectDisposedException(this.GetType().Name);
}
protected virtual void Dispose(bool disposing)
{
if (!_isDisposed)
{
if (disposing)
{
//part 1 : disposing managed objects
_command.Dispose();
_command.Connection.Dispose();
if (_command.Transaction != null)
_command.Transaction.Dispose();
}
//part 2: disposing unmanged objects. Here there are no unmanged objects.
_isDisposed = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
//~DbCommandExecutor() //No need of finalize here. Because there is no unmanged objects in my class. ie, no code in part 2.
//{
// Dispose(false);
//}
#endregion直到你的代码有了第二部分的代码,才需要终结器(或析构函数)语法的。否则,为了安全起见,应该实现它。也就是说,即使程序员没有正确调用dispose方法,finalize也应该清理非托管资源。
比较示例:来自msdn
http://msdn.microsoft.com/en-us/library/system.idisposable.dispose.aspx和http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx
https://stackoverflow.com/questions/386762
复制相似问题