Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# using语句中成员的范围_C#_Using Statement - Fatal编程技术网

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它保存在同一个对象上,因此如果该对象已被处置,并且存储库尝试使用该对象上不支持的操作