C#重用方法并避免使用

时间:2017-12-07 23:13:34

标签: c#

我想可以选择处理(使用using语句)一个对象。如果连接字符串在构造函数中传递,那么必须使用dispose,如果在构造函数中传递了对象SQLDataLayer,那么我不想处置。这是为了避免在每个可重用的方法中传递SQLDataLayer对象,这是正确的方法吗?

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;
    }   
}

谢谢!

3 个答案:

答案 0 :(得分:1)

使用只是简单的

try
{
  obj = new Obj();

}
finally
{ 
   obj.Dispose();
}

如果需要,您可以直接调用Dispose。只需尝试/终于在最后进入if(xxx) obj.Dispose()

答案 1 :(得分:0)

您不需要在using语句中声明变量。 您可以创建using语句,在某些情况下只执行任何操作:

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

答案 2 :(得分:0)

在您的特定示例中,如下所示:

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

这也修复了你离开类字段的错误,指的是你还要处理的短暂连接。

为了更一般的用处,有一个实现Dispose的holder类并且有条件地在它所拥有的对象上调用Dispose是有帮助的。