使用静态成员时重新分配资源

时间:2011-09-04 09:44:25

标签: c# asp.net lifecycle

当我们有一个包含几个使用一个静态对象的静态方法的类时,请考虑这种情况。

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();
    }
}

感谢。

2 个答案:

答案 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块。