C# using语句中成员的范围
我对下面的代码、使用语句的范围及其对象处理感到困惑C# using语句中成员的范围,c#,using-statement,C#,Using Statement,我对下面的代码、使用语句的范围及其对象处理感到困惑 using(DbFactory db = new DbFactory()) { Repository repo = new Repository<someobject>(db); result = repo.Get(somecondition); } 现在,DbFactory将在using语句之后被释放吗 工厂会被处理掉吗 对 using语句中使用的repo变量的范围是什么 repo的作用域是它所包含的块,因此它所包装
using(DbFactory db = new DbFactory())
{
Repository repo = new Repository<someobject>(db);
result = repo.Get(somecondition);
}
现在,DbFactory将在using语句之后被释放吗
工厂会被处理掉吗
对
using语句中使用的repo变量的范围是什么
repo
的作用域是它所包含的块,因此它所包装的是一对大括号(“{”,“}”)。在本例中,它恰好与使用语句的主体一致,是的
工厂会被处理掉吗
对
using语句中使用的repo变量的范围是什么
repo
的作用域是它所包含的块,因此它所包装的是一对大括号(“{”,“}”)。在这种情况下,它恰好与using
语句的主体一致,是的。repo
变量(在第一种情况下)的范围是using
语句。不能在using
语句之外引用它,因为它是在那里声明的
我们无法判断结果
变量的范围,因为您尚未显示它的声明,但它至少“比使用语句的大”
更有趣的是result
的值所指的对象在DbFactory
被处理后的可用性。这是特定于实现的,基本上。。。我希望,如果访问任何结果
属性需要进一步的数据库查询(例如获取外键引用的对象),那么它将失败,但已经获取的任何内容都应该可以
至于处置的时间安排-将使用
语句在末尾处置DbFactory
。这与垃圾收集是完全不同的,而且想必存储库对象仍然会有一个对它的引用,但是在工厂被处理后,它可能会变得无用。因此,如果在using
语句之后调用repo.Get(…)
,您可能会看到异常,这取决于该代码对工厂的实际作用以及已处置工厂的行为。同样,垃圾处理不是垃圾收集。它只是调用Dispose
方法-CLR并不以任何特殊方式关心这个问题。repo
变量的范围(在第一种情况下)是using
语句。不能在using
语句之外引用它,因为它是在那里声明的
我们无法判断结果
变量的范围,因为您尚未显示它的声明,但它至少“比使用
语句的大”
更有趣的是result
的值所指的对象在DbFactory
被处理后的可用性。这是特定于实现的,基本上。。。我希望,如果访问任何结果
属性需要进一步的数据库查询(例如获取外键引用的对象),那么它将失败,但已经获取的任何内容都应该可以
至于处置的时间安排-将使用
语句在末尾处置DbFactory
。这与垃圾收集是完全不同的,而且想必存储库对象仍然会有一个对它的引用,但是在工厂被处理后,它可能会变得无用。因此,如果在using
语句之后调用repo.Get(…)
,您可能会看到异常,这取决于该代码对工厂的实际作用以及已处置工厂的行为。同样,垃圾处理不是垃圾收集。它只是调用Dispose
方法-CLR并不以任何特殊方式关心这一点。如果回购协议也是一次性的,您可能也希望对其进行处置,例如:
using(DbFactory db = new DbFactory())
using(Repository repo = new Repository<someobject>(db))
{
result = repo.Get(somecondition);
}
使用(DbFactory db=new DbFactory())
使用(存储库repo=新存储库(db))
{
结果=回购获取(某些条件);
}
如果回购协议也是一次性的,您可能还想处置它,例如:
using(DbFactory db = new DbFactory())
using(Repository repo = new Repository<someobject>(db))
{
result = repo.Get(somecondition);
}
使用(DbFactory db=new DbFactory())
使用(存储库repo=新存储库(db))
{
结果=回购获取(某些条件);
}
这是:
Repository repo;
ResultObject result;
using(DbFactory db = new DbFactory())
{
repo = new Repository<someobject>(db);
result = repo.Get(somecondition);
}
现在像这样使用它:
ResultObject result;
using (Repository repo = new Repository(new DbFactory())
{
result = repo.Get(somecondition);
}
或使用嵌套的,使用:
using (DbFactory db = new DbFactory())
{
using(Repository repo = new Repository(db))
{
result = repo.Get(somecondition);
}
}
这:
现在像这样使用它:
ResultObject result;
using (Repository repo = new Repository(new DbFactory())
{
result = repo.Get(somecondition);
}
或使用嵌套的,使用:
using (DbFactory db = new DbFactory())
{
using(Repository repo = new Repository(db))
{
result = repo.Get(somecondition);
}
}
编辑了这个问题。我很困惑,repo变量会在using语句之后保存DbContext的Dispose,还是在using语句之后立即保存DbContext的Dispose,并且repo会等待gc?Dispose与垃圾收集器没有任何关系,因为Dispose方法不是析构函数,所以只有在Dispose方法被调用时才会调用gc。@jonskeet Great point,我在寻找处置的时机。编辑了这个问题。我很困惑,repo变量会在using语句之后保存DbContext的Dispose,还是在using语句之后立即保存DbContext的Dispose,并且repo会等待gc?Dispose与垃圾收集器没有任何关系,因为Dispose方法不是析构函数,所以只有在Dispose方法被调用时才会调用gc。@jonskeet Great point,我在寻找处置的时机,我知道。但是,将存储库设置为一次性的好模式吗?我知道这一点。但是,将存储库设置为可丢弃的模式好吗?因此repo
变量不会保留对DbFactory
的处置,对吗?@Rebornx它会保留同一个对象,因此如果该对象已被处置,并且存储库尝试使用在已处置对象上不受支持的操作,因此,repo
变量不会保存对DbFactory
的处置,对吗?@Rebornx它保存在同一个对象上,因此如果该对象已被处置,并且存储库尝试使用该对象上不支持的操作