我有以下类,当经常从 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/