Делает ли разделение массива с помощью Index / Range создание копии массива - PullRequest
0 голосов
/ 24 мая 2019

С C # 8.0, увидев введение структур Index и Range, теперь мы можем легко получить фрагмент массива, выполняющий что-то вроде

string[] baseArray = {"a","b", "c", "d", "e", "f"};

var arr = baseArray[1..^2];

Копирует ли массив, как этот, массив?Или он делает это без копирования, как ArraySegment<T>?

1 Ответ

2 голосов
/ 24 мая 2019

Попробуйте сами:

string[] baseArray = { "a", "b", "c", "d", "e", "f" };
var arr = baseArray[1..^2];
Debug.WriteLine(arr[0]);
Debug.WriteLine(baseArray[1]);
arr[0] = "hello";
Debug.WriteLine(arr[0]);
Debug.WriteLine(baseArray[1]);

выход

b
b
hello
b

Можно сделать вывод, что массив string скопирован.

Однако, если мы используем массив объектов:

public class Foo
{
    public string Bar { get; set; }
}

Foo[] baseArray =
{
    new Foo { Bar = "a" },
    new Foo { Bar = "b" },
    new Foo { Bar = "c" },
    new Foo { Bar = "d" },
    new Foo { Bar = "e" },
    new Foo { Bar = "f" }
};

var arr = baseArray[1..^2];
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);
arr[0].Bar = "hello";
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);

arr[0] = new Foo { Bar = "World" };
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);

Это выводит

b
b
hello
hello
World
hello

Объекты в массиве не копируются, а имеют ссылки.

Установка другого объекта в массиве не повлияет на другой.

...