簡體   English   中英

在“using”語句中使用各種類型 (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM