当前位置:  开发笔记 > 编程语言 > 正文

使用声明中的成员范围

如何解决《使用声明中的成员范围》经验,为你挑选了1个好方法。

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

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

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

EDIT1:

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

public class Repository
{
    private _dbFactory;

    public Repository(DbFactory dbFactory)
    {
        _dbFactory = dbFactory;
    }
}

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



1> Jon Skeet..:

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

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

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

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有