2

我在一些生成代码分析警告的遗留代码中看到了这一点:

  Database db = DatabaseFactory.CreateDatabase(strDBCon);
  DbCommand dbCommand = db.GetSqlStringCommand(sb.ToString());

  using (IDataReader dataReader = db.ExecuteReader(dbCommand))
  {
     while (dataReader.Read())
     {
     }
     dataReader.Close();  // <-- this is redundant as close is covered by using's implicit dispose
  }
  dbCommand.Connection.Close();
  dbCommand.Dispose();
  db = null;

我在这里读到过,除了处理 dbCommand 之外,还必须关闭 dbCommand.Connection 属性。我原以为 dbCommand 会处理任何子一次性对象,在这种情况下是 Connection。如果不是这种情况,为什么?

4

1 回答 1

3

在这方面,类型可以选择拥有某物或仅使用某物。在您的情况下,具体而言,您所做的只是传递您创建的现有实例,并且很可能希望再次使用该实例。

如果该类型是使用传入的类型的实例显式构造的,您可能希望它获得该实例的所有权,因此将其作为其处置模式的一部分进行管理,但在瞬态方法调用的情况下则不然。

于 2013-05-01T10:16:42.553 回答