在using语句中使用各种类型(C#)

因为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 } 

因为我需要处理的只是连接而不是命令,但除此之外。

你可以这样做:

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

这使编码非常好。