簡體   English   中英

C#IDisposable使用:最佳實踐

[英]C# IDisposable Using: Best Practice

我已經在USING語句中包裝我的OracleConnection和OracleCommand對象一段時間了,但是,在運行代碼分析器之后,我發現OracleParameter也實現了IDisposable。 以下代碼是否正確? 是否有更好的可讀性或結構技術? 乍一看,它似乎與USING語句混雜在一起:

using (OracleConnection conn = new OracleConnection(connectionstring))
{
    conn.Open();
    using (OracleCommand cmd = new OracleCommand(sql, conn))
    {
        cmd.BindByName = true;

        using (OracleParameter param1 = new OracleParameter("p1", OracleDbType.Int32, System.Data.ParameterDirection.Input))
        {
            param1.Value = int.Parse(value1);
            cmd.Parameters.Add(param1);
        }

        using (OracleParameter param2 = new OracleParameter("p2", OracleDbType.Varchar2, System.Data.ParameterDirection.Input))
        {
            param2.Value = value2;
            cmd.Parameters.Add(param2);
        }

        using (OracleDataReader dr = cmd.ExecuteReader())
        {
            // loop data here...
        }
    }
}

您只想在使用的最后處置參數,包括在查詢期間(以及可能讀取結果):

using (OracleConnection conn = new OracleConnection(connectionstring))
{
    conn.Open();
    using (OracleCommand cmd = new OracleCommand(sql, conn))
    {
        cmd.BindByName = true;

        using (OracleParameter param1 = new OracleParameter("p1", OracleDbType.Int32, System.Data.ParameterDirection.Input))
        using (OracleParameter param2 = new OracleParameter("p2", OracleDbType.Varchar2, System.Data.ParameterDirection.Input))
        {
            param1.Value = int.Parse(value1);
            cmd.Parameters.Add(param1);
            param2.Value = value2;
            cmd.Parameters.Add(param2);

            using (OracleDataReader dr = cmd.ExecuteReader())
            {
                // loop data here...
            }
        }
    }
}

請注意,您可以在一行中放置多個using語句。 這是因為,就像if語句一樣,

  1. using語句被認為是一個簡單的語句(即使是一個塊);
  2. using語句可以使用塊或下面的語句。

我不確定它是否能正常工作。 考慮到在使用結束時,兩個參數都應該被處理掉。 您的cmd.Parameters對象仍然保留對它們的引用這一事實並不排除OracleParameter Dispose方法中可能發生的情況。 對於所有密集目的,該特定對象的開發人員可能正在清除OracleCommand期望填充的字段。

那里有一些危險。 如果您確定要正確處理OracleParameters ,我建議您在使用OracleDataReader之后將其丟棄。

請記住,通常在使用完對象后調用Dispose 你告訴它釋放它所持有的所有資源。 如果您沒有使用物體,請不要過早丟棄它。

using (OracleConnection conn = new OracleConnection(connectionstring)) 
using (OracleCommand cmd = new OracleCommand(sql, conn)) 
using (OracleParameter param1 = new OracleParameter("p1", OracleDbType.Int32,
       System.Data.ParameterDirection.Input)) 
using (OracleParameter param2 = new OracleParameter("p2", OracleDbType.Varchar2,
       System.Data.ParameterDirection.Input)) 
}
    conn.Open(); 
    cmd.BindByName = true; 

    param1.Value = int.Parse(value1); 
    cmd.Parameters.Add(param1); 

    param2.Value = value2; 
    cmd.Parameters.Add(param2); 

    using (OracleDataReader dr = cmd.ExecuteReader()) 
    { 
        // loop data here... 
    } 
} 

不這是不正確的,因為您甚至在使用它們之前就已經處理了這些參數。

相反,你應該這樣

OracleParameter param1 = new OracleParameter("p1", OracleDbType.Int32, System.Data.ParameterDirection.Input);

param1.Value = int.Parse(value1);
cmd.Parameters.Add(param1);


OracleParameter param2 = new OracleParameter("p2", OracleDbType.Varchar2, System.Data.ParameterDirection.Input);

param2.Value = value2;
cmd.Parameters.Add(param2);


using (OracleDataReader dr = cmd.ExecuteReader())
{
  // loop data here...
}

param1.dispose();
param2.dispose();

你能看一下連接和命令源代碼,它是否處理參數? 如果連接或命令對象配置模式包裝參數並將它們放置在它們被丟棄的位置。 你應該擔心它。 我認為它應該/應該。

此代碼不正確。 您創建的params仍然在using語句范圍之外using因為您將它們添加到參數集合中,但using語句將在控制離開范圍時調用Dispose參數。 這意味着當時間到了使用命令中的參數時,它們已經被已經去掉了

根據MSDN ,你只需要使用usingConnectionDataReader對象。 我從未見過using (或.Dispose() )與ADO.NET參數對象一起使用。 如果這是必要的,甚至是可取的,我認為在過去十年中已經有一段時間了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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