【发布时间】:2013-05-24 17:42:53
【问题描述】:
静态成员与实例无关,而是与类型本身有关。
但我想知道:
如果我有这门课:
public class A
{
...
public static int MyInt{get;set;}
...
}
我当然可以创建new A()
但我的问题是:
- “卡在”类型本身的静态成员是否会阻止实例被 GC 处理?
【问题讨论】:
标签: c# .net static garbage-collection
静态成员与实例无关,而是与类型本身有关。
但我想知道:
如果我有这门课:
public class A
{
...
public static int MyInt{get;set;}
...
}
我当然可以创建new A()
但我的问题是:
【问题讨论】:
标签: c# .net static garbage-collection
不一定。静态成员属于类本身,CLR 将其保存为Type 对象。如果静态成员是A 类型的对象,那么静态成员可以防止A 的特定实例被垃圾回收。
public class Example
{
// this particular instance of Example will not be collected
private static readonly Example Default = new Example();
public void Foo()
{
// this instance *can* be collected after Foo returns
Example anotherInstance = new Example();
}
}
这种行为对于某些不一定是单例但确实具有无状态的“默认”行为的类很有用。我使用它的一个例子是 ANTLR 4 项目的 C# 运行时库中的 ParseTreeWalker.Default 字段。如果您需要默认行为,您可以使用该实例而不创建新对象,但您也可以选择创建您自己的类的实例,该类扩展 ParseTreeWalker 以添加您自己的行为。
【讨论】:
不,它没有。这可以通过覆盖终结器轻松显示。
【讨论】: