2010-10-08 82 views
8

我的一个同事声称在C#中有非静态类中的静态成员可以防止这些类的实例被垃圾收集,并且这是一个常见的源C#内存泄漏。因此,他总是将静态成员包装在静态类中,并通过静态类中的静态属性或方法从那里获取对静态成员的访问权限。我一直认为静态是在栈上,而不是堆,所以与垃圾收集没有任何关系。这对我来说并不合适。关于非静态类和垃圾回收中的静态成员的问题

这是什么道理?

回答

11

他不知道他在说什么。非静态类中的静态成员做而不是防止垃圾收集类的实例。

也就是说,静态可以在堆栈或堆上。垃圾回收并不重要。重要的是,类型的静态部分不存储在类型的实例中。

0

你的朋友是不正确的。

静态方法的思想是没有那个类的实例。所以什么都不存在垃圾收集。

尝试将this放在非静态类中的静态方法内部,看看会发生什么。

5

静态成员是GC的根源。任何从静态引用的东西都会保持活着。静态引用是处于静态类中还是处于非静态类中是无关紧要的。

如果你有一个非静态类,它有一个静态字段,并且你有这个类的实例,静态字段没有很多实例 - 这是静态定义的一部分 - 它不是每个实例字段。所以,课堂本身是否是静止的都没有区别。

所以,是的,静态引用通常是内存泄漏的原因,尤其是静态事件,如果合适的话您还没有退订。将类更改为静态不会解决内存泄漏问题 - 当指向的实例的生命周期结束时,您需要删除静态引用。通常这是通过Dispose()来完成的,并使Dispose清除引用/事件订阅。

This是了解GC如何工作,如何识别垃圾以及如何识别垃圾的好地方。以及终结者和更多...