题
由于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();
}
}
这使得编码非常好的。
不隶属于 StackOverflow