我想向我的 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/