2017-01-04 185 views
2

我有以下类用于在通常从Oracle数据库调用不同数据集时将代码重复最小化。主要是我需要帮助来删除重载的构造函数中的代码重复,但任何其他建议也将被赞赏。C#重载的构造函数问题

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(); 
    } 
} 
+4

你不应该对这个班终结。终结器用于清理*非托管*资源,而不是用于处理受管资源。你应该实现'IDisposable'并在'Dispose'方法中处理组合对象,而不是任何终结器。 – Servy

回答

-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)可能产生进一步的有用信息,包括我的回答

+0

完美。谢谢。 – Simon

+0

我认为当你定义具有最大参数个数的构造函数并通过'this'在其他重载构造函数中使用它时,最好使用相反的方法。欢迎你使用'this' –

+1

@Simon。我会考虑Jon Skeet和Servy执行IDisposable –

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
  • 删除终结