Как работает ImmutableList C#
Допустим у нас есть такой код:
var builder = ImmutableList.CreateBuilder<string>();
Тогда, при добавлении элемента - мы получим совершенно новый объект?
builder.Add("1"); тогда получается - это уже другой объект, не тот, что выше
builder[0] = "1"; снова получаем совершенно новый объект
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Нет, не так. Билдер - это не сам лист. Билдер предназначен для того, чтобы немутабельный список построить без дополнительных аллокаций.
Можно считать, что билдер - это обычный List<T>.
ImmutableList<string>.Builder builder = ImmutableList.CreateBuilder<string>();
builder.Add("1"); // это все тот же объект
builder.Add("2"); // это все тот же объект
ImmutableList<string> list1 = builder.ToImmutable(); // а здесь начинается немутабельность
ImmutableList<string> list2 = list1.Add("3");
Console.WriteLine(ReferenceEquals(list1, list2));
Console.WriteLine(string.Join(" ", list1));
Console.WriteLine(string.Join(" ", list2));
Вывод в консоль
False
1 2
1 2 3
Можно даже так сделать, и логический смысл не поменяется
List<string> builder = new List<string>();
builder.Add("1");
builder.Add("2");
ImmutableList<string> list = builder.ToImmutableList();
Но технически это не совсем одно и то же, что и билдер. Для немутабельного листа лучше и эффективнее использовать именно ImmutableList<string>.Builder.