c# - 将 C#'s ' using' 语句与自定义对象的函数一起使用,是否需要实现 IDisposable?

标签 c# idisposable sqlconnection

我有一个像这样的 sqlConnection 管理器类:

public class SQLConn {
  public string connStr = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];

  private SqlConnection sqlConn;

  public SqlConnection Connection()
  {
      sqlConn = new SqlConnection(connStr);

      return sqlConn;
  }

  public void Open()
  {
        sqlConn .Open();
  }
}

如果我使用带有“using”语句的函数,例如:

var conn = new SQLConn();

using (conn.Connection()) 
{ 
    String query = "Select * from table";
    objSql = new SqlCommand(query, conn.Connection());      

    conn.Open(); 
    DoSomething(); 
}

自从 conn.Connection() 返回一个 SqlConnection 对象后,using 语句是否自动处理连接?或者,我是否必须在 SqlConn 类上实现 IDisposable 和自定义 Dispose 方法?

这是一个好方法吗?我正在使用遗留代码,但我还不能使用 ORM,但是有没有办法简化这个现有模式来管理/创建 SQL 连接?

最佳答案

using 语句将查看表达式的最终类型 - 即从 .Connection() 返回的任何内容;如果返回的是 IDisposable 的东西,那么你没问题。

如果你弄错了,编译器会告诉你;-p(它不会让你在不是IDisposable的东西上使用using)。

您可能应该注意在何处创建两个 连接:

using (var c = conn.Connection()) // <==edit
{ 
    String query = "Select * from table";
    objSql = new SqlCommand(query, c); // <==edit

    c.Open(); 
    DoSomething(); 
}

可能还有:

public SqlConnection Connection()
{
  if(sqlConn == null) sqlConn = new SqlConnection(connStr); // <== edit
  return sqlConn;
}

关于c# - 将 C#'s ' using' 语句与自定义对象的函数一起使用,是否需要实现 IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/915022/

相关文章:

C# 处理对象

c# - 内连接后数据库表不显示数据

c# - 使用除系统数据库之外的数据库名称填充下拉列表

c# - 在 .NET Core/.NET 5+ 中使用 TransactionScope 和 SQL 连接池时如何避免 PlatformNotSupportedException

c# - 在一个 Nuget 包中定位 .Net Core Framework 和完整的 .Net 4.5/4.6 Framework

c# - 在 C# 中将子类型列表作为父类(super class)型列表返回

c# - 我可以在不复制内存的情况下创建一个包含现有数组子集的新数组引用吗?

c# - Dispose 应该做什么 - 只清理资源或执行一些 "business logic"?

c# - 如何通过省略字符串的某些部分来验证或比较字符串

c# - 在 System.Windows.Form 派生类中的何处配置资源?