Вопрос оператора C # ‘using’

#c# #dispose #idisposable #using-statement

#c# #утилизировать #idisposable #using-statement

Вопрос:

Если вы используете предложение 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;
    }
}
  

Комментарии:

1. Почему бы вам не использовать другую форму using : using System.Data.SqlClient; ?

Ответ №1:

Вы можете сложить инструкции следующим образом (для ранней инициализации всех одноразовых объектов)

 using (...)
using (...)
{
  ...
}
  

или вы можете использовать вложенные инструкции using для каждого нужного вам одноразового объекта

 using (...)
{
   using (...) { ... }
   using (...) { ... }
}
  

Ответ №2:

Будет удален только объект, созданный в предложении using. Если вы хотите убедиться, что вызов dispose автоматически генерируется для каждого одноразового объекта, созданного внутри блока using, вам нужно будет обернуть каждый из них в предложение using (или вы можете просто вызвать dispose или close, в зависимости от того, что они поддерживают, конечно). Итак, ответ не таков.

Ответ №3:

Нет. Вам придется явно вызывать Dispose те, которые не входят в параметры using инструкции.