使用 Index/Range 切片数组是否创建数组的副本
Does slicing an array using Index/Range create a copy of the array
随着 C# 8.0 引入了结构 Index
和 Range
,我们现在可以轻松地获取数组的一部分来执行类似
的操作
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
数组中的对象不是被复制而是被引用。
在数组中设置另一个对象不会影响另一个对象。
随着 C# 8.0 引入了结构 Index
和 Range
,我们现在可以轻松地获取数组的一部分来执行类似
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
数组中的对象不是被复制而是被引用。
在数组中设置另一个对象不会影响另一个对象。