C# IDisposable 使用 : Best Practice

标签 c# coding-style idisposable using

一段时间以来,我一直在使用 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 语句被认为是一个简单的语句(即使有一个 block );和
  2. using 语句可以在下面使用 block 或语句。

关于C# IDisposable 使用 : Best Practice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7853698/

相关文章:

c# - Web API 和 Entity Framework ,在哪里指定数据库连接?

c# - 什么时候太多 "lambda action"?

java - System.out.println(true) 和 System.out.println ("true"之间的区别)

具有一次性成员的 C# ValueTuple

c# - 如何处理 Automapper 异常(try/catch)

c# - LINQ 字典查询

c# - CallerMemberNameAttribute是否使用反射

c# - 单击超链接字段时获取 gridview 的索引

c# - Dispose 应该做什么 - 只清理资源或执行一些 "business logic"?

c# - 处理 MailMessage 附件