0

我一直在阅读 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 属性实例化另一个等等?

有人可以解释一下吗?如果我上面的理解不正确,也请纠正我。

4

1 回答 1

4

Empty是静态的,因此只创建一次。由于它是不可变的,因此将相同的实例返回给任何调用Clear.

于 2014-11-13T14:50:02.153 回答