【发布时间】:2015-01-10 18:06:51
【问题描述】:
我一直在阅读 Microsoft 刚刚发布的 .Net 核心项目中的一些代码。 (https://github.com/Microsoft/dotnet) 很高兴能够看到 .Net 核心团队是如何实现的,我想我可以从他们的代码中学到一两件事。
引起我注意的一件事是 Clear() 的函数是如何实现的。
[SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")]
public static readonly ImmutableList<T> Empty = new ImmutableList<T>();
public ImmutableList<T> Clear()
{
Contract.Ensures(Contract.Result<ImmutableList<T>>() != null);
Contract.Ensures(Contract.Result<ImmutableList<T>>().IsEmpty);
return Empty;
}
在我看来,当您创建一个新列表时,空属性会填充一个新列表,然后在运行 Clear 函数时返回该列表;从而取消引用旧列表(如果你说:var students = students.Clear();)并允许 GC 清除旧列表。
所有这些都非常酷,我不明白的是,上面对 Empty 属性的定义如何不会导致无限循环?如果每次创建一个新列表时,它实际上会生成两个,那么这是否意味着为 Empty 属性列表实例化的新 ImmutableList 也为它的 Empty 属性实例化另一个等等?
有人可以解释一下吗?如果我上面的理解不正确,还请纠正我。
【问题讨论】:
-
它是静态的 - 内存中只有一个
new ImmutableList<T>用于此类型的Empty属性。 -
您是否错过了静态关键字?
-
谢谢@Charleh,我没有意识到静态是如何工作的。我认为它只是为那个实例在内存中创建了一个 new ImmutableList
。我很高兴我现在问了。
标签: c# .net infinite-loop immutablelist