由于using语句C#的仅仅是尝试语法糖/最后{}处置为何要接受多个对象,只有当他们是同一类型的?

我不明白这一点,因为所有他们需要的是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
}

因为所有我需要处理的是连接而不是命令,而是这是除了点。

有帮助吗?

解决方案

您可以做到这一点,但:

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

也许,这将是令人满意的给你。

其他提示

有没有特别好的技术原因;我们可以想出,允许非均质类型的多个声明语法。既然我们都没有了,已经有一个完美,清晰,易懂,相当精确的机制来声明不同类型的使用块嵌套,我们就不可能增加新的语法糖只是为了节省几个按键。

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

我个人的使用,这可能符合该法案的方式:

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

这使得编码非常好的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top