使用静态成员时释放资源

本文关键字:释放资源 静态成员 | 更新日期: 2023-09-27 18:07:22

考虑这样一种情况:一个类有两个使用一个静态对象的静态方法。

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

谢谢。

使用静态成员时释放资源

静态变量连续分配是坏事。密切关注您的内存消耗,特别是在谈论服务器端组件(ASP.NET)时。

回答你的问题:当GC可以一个不再被应用程序中任何人引用的对象时,他会收集

不要这样做。使用这种方法很容易陷入内存问题,并且花费数小时来分析和查找内存泄漏。

如果你想改变一个对象的内容,写一个函数来更新对象的内容,而不需要创建一个新的实例

在第二个代码示例中,垃圾收集器将在调用actions.Walk()之后的某个时间销毁对象。垃圾收集器以不确定的方式执行此操作,即您无法确定何时执行此操作。

如果您的类型正在使用您想要确定地处置的资源,那么该类型应该实现IDisposable,并且它的Dispose方法的实现应该执行这些资源的处置。

消费代码可以直接调用此方法或使用using块来处置对象,从而处置它的资源。

例如:-

public class PresonActions : IDisposable
{
    ...
    public void Dispose()
    {
        ...
    }
}
public class Person
{
    public static void Walk()
    {
        using(var actions = new PresonActions())
        {
            actions.Walk();
        }
    }
}

请注意,由于您不会将实例用于多个方法调用,因此在静态属性中创建它是没有意义的。它可以在方法中创建,这允许使用using块。