C#重载构造函数问题

标签 c#

我有以下类,当经常从 Oracle 数据库调用不同的数据集时,我使用它来最大程度地减少代码重复。主要是我需要帮助来删除重载构造函数中的代码重复,但任何其他建议也将不胜感激。

public class UniformData
{
    private string connection = "My Connection String";
    private OracleConnection con;
    private OracleCommand com;
    private OracleDataReader reader;

    public UniformData(string sql)
    {
        con = new OracleConnection(connection);
        con.Open();
        com = new OracleCommand(sql, con);
    }

    public UniformData(string sql, List<SqlParameters> myParams)
    {
        con = new OracleConnection(connection);
        con.Open();
        com = new OracleCommand(sql, con);

        foreach (SqlParameters Param in myParams)
        {
            com.Parameters.Add(Param.ParamName, Param.ParamValue);
        }
    }

    public OracleDataReader GetReader()
    {
        reader = com.ExecuteReader();
        return reader;
    }

    ~UniformData()
    {
        con.Close();
        con.Dispose();
        com.Dispose();
        reader.Close();
        reader.Dispose();
    }
}

最佳答案

通常我会有一个“规范的”构造函数,所有其他构造函数都链接到该构造函数。在您的情况下,这将涉及创建一个空列表:

public UniformData(string sql) : this(sql, new List<SqlParameters>())
{
}

public UniformData(string sql, List<SqlParameters> parameters)
{
    con = new OracleConnection(connection);
    con.Open();
    com = new OracleCommand(sql, con);

    foreach (SqlParameters parameter in parameters)
    {
        com.Parameters.Add(parameter.ParamName, parameter.ParamValue);
    }
}

或者,将参数类型更改为 IEnumerable<SqlParameters>此时您可以使用 Enumerable.Empty :

public UniformData(string sql) : this(sql, Enumerable.Empty<SqlParameters>())
{
}

public UniformData(string sql, IEnumerable<SqlParameters> parameters)
{
    // Body as before
}

可以以另一种方式拆分工作,就像 Mong Zhu 的代码所做的那样 - 但我倾向于认为尽可能将所有工作放在一个地方会更简洁。这使得验证您是否在所有情况下都正确初始化了所有变量变得容易 - 您只需要检查所有构造函数是否都链接到规范的构造函数,并且规范的构造函数是否初始化了所有内容。

另外我会:

  • 让你的类(class)实现IDisposable
  • 移除终结器

关于C#重载构造函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41466969/

相关文章:

c# - FullTextSqlQuery 的搜索范围是什么

c# - Asp.Net Identity 2.0 中的 RoleManager 似乎不支持 Guid

java - 用 Java 编码的 SHA1 从相同的 C# 代码中产生不同的结果

c# - Polly 断路器已处理和未处理的异常

java - 使用 Math.Floor 比显式整数转换有什么好处吗?

c# - 在 FluentValidation 中检查 Guid 空格

c# - 从 IEnumerable 中删除使用过的元素

c# - 如何获取真正运行的进程名?

key 大小的 C# 和 PHP 加密/解密 php 问题

c# - 为什么 Newtonsoft.Json 如此容易发生程序集版本冲突?