我想可以选择处理(使用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;
}
}
谢谢!
答案 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是有帮助的。