使用声明中的成员范围

reb*_*rnx 1 c# using-statement

我对以下代码以及using语句及其对象处理的范围感到困惑.

using(DbFactory db = new DbFactory())
{
   Repository repo = new Repository<someobject>(db);
   result = repo.Get(somecondition);
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,使用块执行后会发生什么DbFactory?using语句中使用
repo变量范围是什么?
DbFactory被使用,Repository并且它有一个成员变量,它将保存DbFactory.那么这将处置DbFactory吗?

EDIT1:

Repository repo;
ResultObject result;
using(DbFactory db = new DbFactory())
{
   repo = new Repository<someobject>(db);
   result = repo.Get(somecondition);
}

public class Repository
{
    private _dbFactory;

    public Repository(DbFactory dbFactory)
    {
        _dbFactory = dbFactory;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在DbFactory会在using语句之后被处理掉吗?

Jon*_*eet 8

repo变量的范围(在第一种情况下)是using声明.你不能在using声明之外引用它,因为它在那里声明.

我们不能告诉result变量的范围,因为你没有显示它的声明,但它至少"比using声明大".

更有趣的是,在处理result之后,所引用的值的对象是多么可用DbFactory.这是特定于实现的,基本上......我希望如果访问任何result属性需要进一步的数据库查询(例如,获取外键引用的对象),那么它将失败,但任何已经获取的内容应该没问题.

至于处置的时间 - DbFactory将在using声明的最后处理.这与垃圾收集完全分开,并且可能该Repository对象仍然会引用它 - 但是在工厂处置之后它可能是无用的.所以,如果你repo.Get(...) using声明中,你可能会看到一个例外,这取决于什么代码实际上与工厂做,以及如何处置厂的行为.再次,处置不是垃圾收集.它只是调用Dispose方法 - CLR不以任何特殊方式关注它.