![](/img/trans.png)
[英]Using enum values with Chars and integer types in a switch statement in C#
[英]Using various types in a 'using' statement (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();
}
}
這使得編碼非常好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.