Microsoft からリリースされたばかりの .Net コア プロジェクトのコードを少し読んでいます。( https://github.com/Microsoft/dotnet ) .Net コア チームがどのように実装したかを見ることができてうれしいです。彼らのコードから 1 つまたは 2 つのことを学べるかもしれないと思いました。
私の注意を引いたのは、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 プロパティの上記の定義が無限ループを引き起こさないのはなぜですか? 新しいリストを作成するたびに、実際には2つ作成される場合、空のプロパティリスト用にインスタンス化された新しいImmutableListも、空のプロパティ用に別のインスタンスをインスタンス化するなどということではないでしょうか?
誰か説明してくれませんか?また、上記の私の理解が正しくない場合は、修正してください。