这是其中一个循环引用吗
本文关键字:一个 循环 引用 | 更新日期: 2023-09-27 18:26:06
我想在我的asp-mvc页面中添加一个易于访问的助手类。我创建了一个名为存储库的类。它有一个静态属性"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"];
}
}
重点是,该类具有使用该类的当前实例(绑定到当前httpcontext)的静态辅助函数。helper函数可以做各种各样的事情,我之所以想这样组织它们,是因为它可以在控制器中生成更好看的代码,而且我有可能访问所有数据库存储库(但只有在这种上下文中访问时,才会创建实际的句柄对象)。
无论如何,正如您所看到的,构造函数将HttpContext作为参数,然后将其存储在一个私有类字段中,这样我就可以键入更少的内容。这意味着Repositorys类实例引用HttpContext类实例,反之亦然。当HttpContext被丢弃时,这是否意味着它仍然留在内存中,由Repository实例的循环引用保留?
"孤立"循环引用不会强制对象留在内存中。
如果你这样做:
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!