使用 Index/Range 切片数组是否创建数组的副本

Does slicing an array using Index/Range create a copy of the array

随着 C# 8.0 引入了结构 IndexRange,我们现在可以轻松地获取数组的一部分来执行类似

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

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

像这样对数组进行切片会复制数组吗?还是像 ArraySegment<T> 那样不复制就完成?

自己试试看:

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

我们可以得出结论,字符串数组被复制了。

但是,如果我们使用对象数组:

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

数组中的对象不是被复制而是被引用。

在数组中设置另一个对象不会影响另一个对象。