использование различных типов в операторе using (C #) - PullRequest
29 голосов
/ 08 июня 2009

Поскольку оператор C # 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
}

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

Ответы [ 4 ]

21 голосов
/ 08 июня 2009

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

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

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

17 голосов
/ 08 июня 2009

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

5 голосов
/ 08 июня 2009

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

0 голосов
/ 17 марта 2015

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

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();
  }
}

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

...