2017-01-04 235 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
  • 刪除終結