gpt4 book ai didi

c# - using 语句中的成员范围

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:15 24 4
gpt4 key购买 nike

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

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

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

编辑1:
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;
}
}

现在 DbFactory 会在 using 语句之后被释放吗?

最佳答案

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

我们无法判断 result 的范围变量,因为您没有显示它的声明,但它至少“比 using 语句大”。

更有趣的是 result 的值的对象如何使用指的是 DbFactory 之后已被处置。那是特定于实现的,基本上......我希望如果访问任何 result properties 需要进一步的数据库查询(例如,获取由外键引用的对象)然后它会失败,但是已经获取的任何东西都应该没问题。

至于处置时机——DbFactory将在 using 的末尾进行处理陈述。这与垃圾收集完全分开,大概是 Repository object 仍然会有一个对它的引用——但是在工厂被处理之后它可能就没有用了。因此,如果您调用 repo.Get(...)using 之后声明,您可能会看到一个异常,具体取决于该代码对工厂的实际操作以及已处置工厂的行为方式。同样,处置不是垃圾收集。它只是调用 Dispose方法 - CLR 不以任何特殊方式关心它。

关于c# - using 语句中的成员范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41858437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com