你的情况很类似于我在查询数据库时经常看到的情况。为了分离逻辑,有时会看到这样的代码:
var reader = ExecuteSQL("SELECT ...");
while (reader.Read())
{
}
public SqlDataReader ExecuteSQL(string sql)
{
using (SqlConnection conn = new SqlConnection("..."))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
return cmd.ExecuteReader();
}
}
}
但是,当然,那是行不通的,因为当 SqlDataReader
从 ExecuteSQL
方法返回时,连接已经关闭(处理)。
因此,上述的替代方案利用委托来实现关注点分离,但仍允许代码正常工作:
ExecuteSQL(reader => {
});
public void ExecuteSQL(string sql, Action<SqlDataReader> processRow)
{
using (SqlConnection conn = new SqlConnection("..."))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
processRow(reader);
}
}
}
}
}
所以,也许你可以在你的情况下尝试类似的东西?像这样:
MakeAndProcess(c => {
});
public void MakeAndProcess(Action<C> processC)
{
using (var a = new A())
using (var b = new B(a))
{
processC(new C(b));
}
}
using
语句会自动处理。这就是using
的作用。问题是当C
尝试使用b
时,它已经被释放了吗? - D Stanleyb
的释放。你可以通过让C
来处理并使C : IDisposable
来实现。参见Return an object created by USING等。 - CodeCaster