29

既然 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

4 回答 4

21

你可以这样做:

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

也许这会让你满意。

于 2009-06-08T18:07:11.037 回答
17

没有特别好的技术原因;我们本可以提出一种允许多个非同质类型声明的语法。鉴于我们没有,并且已经有一个非常好的、清晰、可理解和相当简洁的机制来声明嵌套使用不同类型的块,我们不太可能为了节省一些击键而添加新的语法糖。

于 2009-06-08T18:11:57.800 回答
5

C#中的其他变量声明只允许你在同一个语句中声明多个相同类型的变量;我不明白为什么using标题应该不同。

于 2009-06-08T17:55:31.913 回答
0

我个人的使用方式可能符合要求:

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

这使得编码非常好。

于 2015-03-17T15:40:46.510 回答