在c#中创建一个IDisposable类,在完成时清理SqlConnection

在回答上一个问题时,有人建议:

让SqlConnection成为你的类的成员变量,但是当类处理时,使类IDisposable并处理SqlConnection

我已经把这个建议的实现放在一起(下面),但是想检查一下这个实现是否正确(显然它除了打开连接之外当前没有做任何事情但是想法是那里会有使用连接的方法哪个能够依赖现有的和开放的。

public class DatabaseRecord : IDisposable { protected SqlConnection connection; public DatabaseRecord() { connection = new SqlConnection("ConnectionString"); connection.Open(); } // IDisposable implementation private bool disposed; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { connection.Dispose(); } disposed = true; } } // Destructor ~DatabaseRecord() { Dispose(false); } } 

这会有用吗? 使用DatabaseRecord实例的类是否需要执行任何特殊操作,或者一旦不再使用/引用实例,是否会自动调用Dispose? 这比在需要连接的每个单独的方法体中using (var connection = new SqlConnection("...")) { }更有效/更好吗?

SqlConnection是一个受管资源,应该放在if (disposing)块中。 使用你的类的类应该处理它,理想情况下using块。 这是否优于单独using SqlConnections的块将取决于此类的其他方法以及它们的使用方式。

我见过的所有建议都说DbConnection应该保持最小的时间,所以我希望在我正在审查的代码中看到的格式是

 using (var connection = new SqlConnection("...")) { ... } 

应该将connection.Dispose()移动到if (disposing) { ... }块。 不需要调用Close()因为Dispose()将在连接打开时关闭连接。

这将起作用,并且多个using语句将更有效。 使用DatabaseRecord类的代码可以在using语句中执行此操作,以便在它离开循环时自动清除它。

但是,一个建议是在Dispose方法中检查Connection对象的状态,如果在调用dispose之前它仍处于打开状态,则关闭它。