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