Используя различные типы в операторе 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
}
так как все, что мне нужно удалить, - это соединение, а не команда, но кроме точки.
Ответы
Ответ 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();
}
}
Это делает кодирование очень приятным.