疑问:在其他类创建数据库连接后,using块是否会自动关闭连接?
问题
已知在using块内直接实例化SqlConnection时,无需调用Close()方法,连接会自动关闭。但在项目中,我们通过DBConnectionBackboneService类的GetDBConnection方法创建OracleConnection,再在主类的using块中使用该连接,想确认此场景下连接是否仍会自动关闭,还是需要手动调用Close()?
示例代码
using (SqlConnection conn = new SqlConnection(sConn)) { cmd.Connection = conn; // 执行数据库操作 //conn.Close(); // 无需调用 }
项目代码
public class DBConnectionBackboneService : IDBConnectionBackboneService { public OracleConnection GetDBConnection() { string conString = "<<Connection-String>>"; return new OracleConnection(conString); } } class main() { using (dbConnection = _dbConnectionRepo.GetDBConnection()) { dbConnection.Open(); // 调用数据库存储过程 // 处理数据集 } }
回答
不需要手动调用Close()方法,连接会自动关闭。
原因很明确:using块的核心作用就是在代码块执行完毕后,自动调用对象的Dispose()方法。而OracleConnection实现了IDisposable接口,它的Dispose()方法会自动完成连接的关闭和资源释放——这和直接在using块里实例化SqlConnection的逻辑完全一致,不管连接对象是直接创建的还是通过其他方法返回的,只要被using块包裹,就会触发这个自动清理流程。
就算你手动调用了Close(),using块依然会执行Dispose(),不过这属于重复操作,不会有问题,但完全没必要多此一举。
内容的提问来源于stack exchange,提问作者Keval Patel
相关产品推荐
相关产品推荐

