C#重载构造函数问题

时间:2017-01-04 15:05:01

标签: 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();
    }
}

3 个答案:

答案 0 :(得分:9)

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

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的代码那样 - 但我倾向于发现将所有工作尽可能地放在一个地方更清洁。这样可以很容易地验证您在所有情况下都已正确初始化所有变量 - 您只需要检查所有构造函数是否链接到规范变量,并且规范化变量初始化所有变量。

另外我会:

  • 让您的班级实施IDisposable
  • 删除终结者

答案 1 :(得分:6)

您可以使用this(parameter)

从更复杂的构造函数中调用更简单的构造函数
public UniformData(string sql)
{
    con = new OracleConnection(connection);
    con.Open();
    com = new OracleCommand(sql, con);
}

public UniformData(string sql, List<SqlParameters> myParams): this(sql)
{
    foreach (SqlParameters Param in myParams)
    {
        com.Parameters.Add(Param.ParamName, Param.ParamValue);
    }
}

original post已有7岁,在研究时可能会错过它。

Using Constructors (C# Programming Guide)可能会产生更多有用的信息,包括我的回答

答案 2 :(得分:-1)

只需让其中一个构造函数调用另一个。要么有没有参数的重载调用带参数的重载,要么传递空列表,或者带参数的重载调用不带参数的重载来初始化连接,这样它只需要添加参数。