C# 'using' 语句问题

5
如果您使用using语句来释放连接,那么在该语句中实现IDisposable接口的其他项是否也会自动释放?如果不是,那么如何处理确保所有IDisposable项都被自动释放?
public static DataTable ReturnDataTable(
    string ConnectionString, string CommandTextString, CommandType CommandType, 
    int CommandTimeout, List<System.Data.SqlClient.SqlParameter> ParameterList = null)
{
    using (System.Data.SqlClient.SqlConnection Connection =
        new System.Data.SqlClient.SqlConnection())
    {
        Connection.ConnectionString = ConnectionString;

        System.Data.SqlClient.SqlCommand Command =
            new System.Data.SqlClient.SqlCommand();
        Command.Connection = Connection;
        Command.CommandText = CommandTextString;
        Command.CommandType = CommandType;
        Command.CommandTimeout = CommandTimeout;

        if (ParameterList != null)
        {
            if (ParameterList.Count > 0)
            {
                foreach (SqlParameter parameter in ParameterList)
                {
                    Command.Parameters.AddWithValue(
                        parameter.ParameterName, parameter.Value);
                }
            }
        }

        System.Data.DataTable DataTable = new System.Data.DataTable();

        System.Data.SqlClient.SqlDataAdapter DataAdapter =
            new System.Data.SqlClient.SqlDataAdapter();
        DataAdapter.SelectCommand = Command;
        DataAdapter.Fill(DataTable);

        return DataTable;
    }
}

为什么不使用另一种形式的 using: using System.Data.SqlClient; - svick
3个回答

7
您可以这样堆叠语句(以尽早初始化所有可释放对象)
using (...)
using (...)
{
  ...
}

或者你可以为每个需要的可处理对象使用嵌套使用语句。
using (...)
{
   using (...) { ... }
   using (...) { ... }
}

3

只有在 using 语句块中创建的对象将会被处理。如果你想要确保每个在 using 语句块中创建的可处理对象都自动调用 dispose,你需要将它们每一个都包裹在一个 using 语句块中 (当然你也可以直接调用 dispose 或 close 方法,取决于它们支持哪种方法)。所以,答案是否定的。


2
不行,那些不在using语句参数中的对象必须显式调用Dispose方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接