使用C#的'using'语句和自定义对象的函数,我是否需要实现IDisposable?

zul*_*mal 8 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

var conn = new SQLConn();

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

    conn.Open(); 
    DoSomething(); 
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ell 12

using语句将查看表达式的最终类型 - 即返回的内容.Connection(); 如果这返回的是什么IDisposable,那么你就可以了.

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

您应该注意创建两个连接的位置:

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

    c.Open(); 
    DoSomething(); 
}
Run Code Online (Sandbox Code Playgroud)

可能:

public SqlConnection Connection()
{
  if(sqlConn == null) sqlConn = new SqlConnection(connStr); // <== edit
  return sqlConn;
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 5

它会工作,但在using {}你将留下一个内部持有Disposed SqlConnection的sqlConn.不是一个非常有用的情况