2017-01-04 12 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

あなたは研究をするときoriginal postは7歳、あなたはそれを逃したことがあり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); 
    } 
} 

を使用して、より複雑なものから単純なコンストラクタを呼び出すことができます。

Using Constructors (C# Programming Guide)は、通常、私は、「標準的な」コンストラクタ他のすべてのコンストラクタチェーンにあるんだけど私の答え

+0

パーフェクト。ありがとう。 – Simon

+0

私はパラメータの最大のカウントを持つコンストラクタを定義し、 'this'を介して他のオーバーロードされたコンストラクタでそれを使用すると逆の方法を使用することがより好ましいと思います –

+1

@サイモンあなたは大歓迎です。私は、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); 
    } 
} 

、あなたがEnumerable.Emptyを使用することができ、その時点でIEnumerable<SqlParameters>にパラメータの種類を変更します:しかし、空のリストを作成する伴うだろう、あなたの場合は

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

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

あなたを分割することができますMong Zhuのコードがそうであるように、他の方法で作業しますが、可能な限りすべての作業を単一の場所に保つことがよりクリーンである傾向があります。これは、すべての場合にすべての変数を適切に初期化したことを簡単に検証できるようにします。すべてのコンストラクタが正規のものにチェーンされていることを確認するだけで、正規のものはすべて初期化されます。

はまた私がなります

  • は、あなたのクラスは
  • IDisposableあなたはこのクラスのファイナライザを持つべきではないファイナライザ
関連する問題