我一直在阅读 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 属性实例化另一个等等?
有人可以解释一下吗?如果我上面的理解不正确,也请纠正我。