Подтвердить что ты не робот

Используя различные типы в операторе using (С#)

Так как оператор С# using является просто синтаксическим сахаром для try/finally {dispose}, почему он принимает несколько объектов ТОЛЬКО, ЕСЛИ ОНИ ИМЕЮТСЯ ОДНОГО ТИПА?

Я не понимаю, потому что все, что им нужно, это IDisposable. Если все они реализуют IDisposable, это должно быть хорошо, но это не так.

В частности, я привык писать

using (var cmd = new SqlCommand())
{
    using (cmd.Connection)
    {
        // code
    }
}

который я уплотняю в:

using (var cmd = new SqlCommand())
using (cmd.Connection)
{
    // code
}

и я хотел бы еще больше свести к следующему:

using(var cmd = new SqlCommand(), var con = cmd.Connection)
{
    // code
}

но я не могу. Я мог бы, скажем, сказать:

using((var cmd = new SqlCommand()).Connection)
{
    // code
}

так как все, что мне нужно удалить, - это соединение, а не команда, но кроме точки.

4b9b3361

Ответ 1

Вы можете сделать это, хотя:

using (IDisposable cmd = new SqlCommand(), con = (cmd as SqlCommand).Connection)
{
   var command = (cmd as SqlCommand);
   var connection = (con as SqlConnection);
   //code
}

Возможно, это будет для вас удовлетворительным.

Ответ 2

Нет особых технических причин; мы могли бы придумать синтаксис, допускающий множественные объявления неоднородных типов. Учитывая, что мы этого не сделали, и там уже есть совершенно хороший, понятный, понятный и довольно сжатый механизм для объявления вложенных блоков блоков разных типов, мы вряд ли добавим новый синтаксический сахар, чтобы сэкономить несколько нажатий клавиш.

Ответ 3

Другие объявления переменных на С# позволяют объявлять несколько переменных одного и того же типа в одном и том же выражении; Я не понимаю, почему заголовки using должны быть разными.

Ответ 4

Мой личный способ использования этого может соответствовать счету:

private const string SQL_CONNECTION = "Your Connection String Here";

private void Test(string sqlCmd)
{
  using (var cmd = new SqlCommand(sqlCmd, new SqlConnection(SQL_CONNECTION)))
  {
    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    cmd.Connection.Close();
    // Close() is not really necessary.
    // Dispose will Close the connection.
  }
}

Нет, это не два экземпляра предложения using в одной строке, но он настолько компактен, насколько вы пытаетесь получить в своем примере.

Что еще, вы можете сделать это еще более компактным и удобным для программистов, превратив строку подключения в частное свойство:

private SqlConnection OpenConnection
{
  get {
    var con = new SqlConnection(SQL_CONNECTION);
    con.Open();
    return con;
  }
}

Теперь этот первый бит кода выше в Test() можно сократить до следующего:

private void Test2(string sqlCmd)
{
  using (var cmd = new SqlCommand(sqlCmd, OpenConnection))
  {
    cmd.ExecuteNonQuery();
  }
}

Это делает кодирование очень приятным.