我对以下代码以及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语句之后被处理掉吗?
repo
变量的范围(在第一种情况下)是using
声明.你不能在using
声明之外引用它,因为它在那里声明.
我们不能告诉result
变量的范围,因为你没有显示它的声明,但它至少"比using
声明大".
更有趣的是,在处理result
之后,所引用的值的对象是多么可用DbFactory
.这是特定于实现的,基本上......我希望如果访问任何result
属性需要进一步的数据库查询(例如,获取外键引用的对象),那么它将失败,但任何已经获取的内容应该没问题.
至于处置的时间 - DbFactory
将在using
声明的最后处理.这与垃圾收集完全分开,并且可能该Repository
对象仍然会引用它 - 但是在工厂处置之后它可能是无用的.所以,如果你repo.Get(...)
后的using
声明中,你可能会看到一个例外,这取决于什么代码实际上与工厂做,以及如何处置厂的行为.再次,处置不是垃圾收集.它只是调用Dispose
方法 - CLR不以任何特殊方式关注它.