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

vit*_*tch 4 .net 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*d M 5

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