Microsoft Immutable Collections: Modyfikacja kolekcji

Tak samo, jak w .NET istnieje klasa StringBuilder za pomocą, której można modyfikować “string” (nie dosłownie), tak w MS immutable collections zaimplementowano analogiczny builder.

Przykład:

var immutableList = ImmutableList<int>.Empty; immutableList = immutableList.Add(1); Debug.Assert(immutableList.Count==1); ImmutableList<int>.Builder builder = immutableList.ToBuilder(); Debug.Assert(builder.Count==1);

Za pomocą ToBuilder() na liście tworzymy builder, który jest kopią danej kolekcji. Następnie jakiekolwiek operacje wykonywane na obiekcie builder, nie będą modyfikowały bazowej listy (tutaj zmienna o nazwie “immutableList”):

var immutableList = ImmutableList<int>.Empty; immutableList = immutableList.Add(1); Debug.Assert(immutableList.Count==1); ImmutableList<int>.Builder builder = immutableList.ToBuilder(); Debug.Assert(builder.Count==1); builder.Add(2); builder.Add(3); Debug.Assert(builder.Count == 3); var newImmutable = builder.ToImmutable(); Debug.Assert(newImmutable.Count == 3); Debug.Assert(immutableList.Count == 1);

Dodałem asercje dla pokazania co jest modyfikowane. Widać wyraźnie, że ToBuilder() tworzy nową wewnętrzna listę, tak jak i ToImmutable. Oczywiście wewnętrzna implementacja, z tego co mi wiadomo, jest dosyć sprytna i nie zawsze realokowane są obiekty. Utrzymywana jest lista albo drzewo i tyko w koniecznych przypadkach obiekty są kopiowane. Autorzy starali się ograniczyć te operacje, aby wydajność nie ucierpiała znacząco w stosunku do klasycznych kolekcji

One thought on “Microsoft Immutable Collections: Modyfikacja kolekcji”

Leave a Reply

Your email address will not be published.