当我们有一个包含几个使用一个静态对象的静态方法的类时,请考虑这种情况。
public class Person
{
private static PresonActions actions = new PresonActions();
public static void Walk()
{
actions.Walk();
}
}
我知道asp.net应用程序中静态成员的生命周期等于appdomain生命周期。 所以这意味着在我重新启动appdomain之前,对象不会被销毁,资源也不会被释放。
但是如果我们每次访问它时都会使用属性来创建类PresonActions的实例,那么对象是否会被销毁?
public class Person
{
private static PresonActions actions { get { return new PresonActions(); } }
public static void Walk()
{
actions.Walk();
}
}
感谢。
答案 0 :(得分:2)
静态变量连续分配是邪恶的。密切注意你的内存消耗,特别是如果你在谈论服务器端组件(ASP.NET)。
回答你的问题:GC收集,当他一个对象时,应用程序中的任何人都不再引用该对象。
不要这样做。使用这种方法并在花费数小时来分析和查找内存泄漏之后,很容易陷入内存问题。
如果要更改对象内容,请编写一个更新对象内容的函数,而不创建新的实例。
答案 1 :(得分:0)
在第二个代码示例中,垃圾收集器将在调用actions.Walk()
后销毁对象一段时间。垃圾收集器以不确定的方式执行此操作,即您无法确定何时执行此操作。
如果您的类型使用了您想要确定性处理的资源,那么该类型应该实现IDisposable
,并且Dispose
方法的实现应该执行这些资源的处理。
然后,使用代码可以直接调用此方法,也可以使用using
块来处置对象,而对象又会处理它的资源。
e.g: -
public class PresonActions : IDisposable
{
...
public void Dispose()
{
...
}
}
public class Person
{
public static void Walk()
{
using(var actions = new PresonActions())
{
actions.Walk();
}
}
}
请注意,由于您没有将实例用于多个方法调用,因此无需在静态属性中创建它。它可以在方法中创建,允许使用using
块。