2017-12-07 5 views
0

オプションで(usingステートメントで)オブジェクトを破棄したいと思います。接続文字列がコンストラクタで渡された場合は、usingメソッドは破棄しなければならず、オブジェクトSQLDataLayerがコンストラクタで渡された場合、破棄したくありません。これは、再利用可能なメソッドごとにSQLDataLayerオブジェクトを渡すことを避けるためですが、これは正しいアプローチですか?C#再利用メソッドと使い捨てを避ける

public class RepoCategory 
{ 
    readonly string connString; 
    SQLDataLayer dl = null; 

    public RepoCategory(string conn_string) 
    { 
     this.connString = conn_string; 
    } 

    public RepoCategory(SQLDataLayer dl) 
    { 
     this.dl = dl; 
    } 

    //I WANT TO MAGICALLY generate using(null) if dl was passed in constructor 
    //or using(dl = new SQLDataLayer(connString)) if connString was passed. 
    public Category Get(int category_sid) 
    { 
     Category cat = null; 
     using (SQLDataLayer dlDispose = (dl == null) ? new SQLDataLayer(connString) : null) 
     { 
      //can this be simplified/avoided? 
      if (dlDispose != null) 
       dl = dlDispose; 
      cat = dl.GetCat();      
     } 
     return cat; 
    } 
    //I DON'T WANT TO PASS THE DL MANUALLY EVERYTIME 
    public Category Get(SQLDataLayer dl, int category_sid) 
    { 
     Category cat = null; 
     cat = dl.GetCat();      
     return cat; 
    } 
} 

ありがとう!使用

+2

あなたのクラスは、消費者が処分方法を選択できるように、おそらくIDisposableを実装する必要があります。 – Crowcoder

答えて

1

は、あなたがしたい場合は、直接のDisposeを呼び出すことができます

try 
{ 
    obj = new Obj(); 

} 
finally 
{ 
    obj.Dispose(); 
} 

のためだけの短い手です。試してみてください。最終的に試してみてください。if(xxx) obj.Dispose()

0

using文で変数を宣言する必要はありません。このようなあなたの特定の例では

SQLDataLayer dl = ...; 
using(someCondition ? dl : null) { 
    ... 
} 
0

、::

SQLDataLayer dlDispose = null; 
SQLDataLayer dl = this.dl ?? (dlDispose = new SQLDataLayer(connString)); 
using (dlDispose) { dl.Blah(...) } 

これはまた、あなたが参照したクラスのフィールドを残してバグを修正し あなただけのいくつかの状況で何もしないusing文を作ることができます短期間の接続でも処理します。

より一般的には、Disposeを実装し、保持するオブジェクトに対して条件付きでDisposeを呼び出すホルダークラスを持つと便利です。

関連する問題