c# - 这是其中一个循环引用吗?

标签 c# httpcontext helper circular-reference

我想向我的 asp mvc 页面添加一个易于访问的帮助器类。我创建了一个名为 Repositories 的类。它有一个静态属性“Current”,它执行以下操作:

public static readonly Repositories Current
{
    get
    {
        if(HttpContext.Current.Items["Repositories"] == null)
            HttpContext.Current.Items["Repositories"] = new Repositories(HttpContext.Current);
        return (Repositories)HttpContext.Current.Items["Repositories"];
    }
}

重点是该类具有使用该类当前实例的静态辅助函数(绑定(bind)到当前 httpcontext)。辅助函数做各种各样的事情,我想像这样组织它们的原因是因为它使 Controller 中的代码看起来更漂亮,而且我有可能访问所有数据库存储库(只有在访问时才创建实际句柄对象尽管在这种情况下)。

无论如何,如您所见,构造函数将 HttpContext 作为参数,然后将其存储在私有(private)类字段中,这样我就不必再输入了。这意味着 Repositories 类实例引用 HttpContext 类实例,反之亦然。当 HttpContext 被删除时,这是否意味着它仍然留在内存中,由 Repositories 实例的循环引用保存?

最佳答案

“孤立的”循环引用不会强制对象留在内存中。

如果你这样做:

class A
{
    public B b;

    ~A()
    {
        Console.WriteLine("COLLECTED A!");
    }
}

class B
{
    public A a;

    ~B()
    {
        Console.WriteLine("COLLECTED B!");
    }
}

并运行这段代码:

var a = new A();
var b = new B();

a.b = b;
b.a = a;

a = null;
b = null;

GC.Collect();

这两个实例都可以(并且将会)被垃圾回收。您将获得类似于以下输出的内容:

COLLECTED B!
COLLECTED A!

关于c# - 这是其中一个循环引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26278435/

相关文章:

ruby-on-rails - 帮助程序中的 capture_haml 不显示参数值

java - NetBeans Java 计算器查询

ruby-on-rails - 包括 collection_select 助手的空白和默认值

c# - 用于获取分组表中具有最大日期的行的 LINQ 查询

wcf - HttpContext.Current在我的Web服务中为null

c# - 从数据层访问 HttpContext 和 User Identity

visual-studio - HttpContext.Current.User.Identity.Name 为空

c# - 上传速度问题: HttpWebRequest

c# - 是否有理由在 Try/Catch 上使用带有 ExceptionThrown 变量的 Try/Finally

c# - 第一次为方法使用单独的类 (.cs) 文件