使用静态成员时释放资源
本文关键字:释放资源 静态成员 | 更新日期: 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
块。