C# 使用索引/范围切片数组是否会创建数组的副本

C# 使用索引/范围切片数组是否会创建数组的副本,c#,arrays,performance,c#-8.0,C#,Arrays,Performance,C# 8.0,随着C#8.0看到结构索引和范围的引入,我们现在可以很容易地获得一个数组的切片,如下所示 string[]baseArray={“a”、“b”、“c”、“d”、“e”、“f”}; var arr=baseArray[1..^2]; 像这样对阵列进行切片是否会复制阵列?或者它不需要像ArraySegment那样进行复制吗 自己试试看: string[]baseArray={“a”、“b”、“c”、“d”、“e”、“f”}; var arr=baseArray[1..^2]; Debug.Writ

随着C#8.0看到结构
索引
范围
的引入,我们现在可以很容易地获得一个数组的切片,如下所示

string[]baseArray={“a”、“b”、“c”、“d”、“e”、“f”};
var arr=baseArray[1..^2];
像这样对阵列进行切片是否会复制阵列?或者它不需要像
ArraySegment
那样进行复制吗

自己试试看:

string[]baseArray={“a”、“b”、“c”、“d”、“e”、“f”};
var arr=baseArray[1..^2];
Debug.WriteLine(arr[0]);
Debug.WriteLine(baseArray[1]);
arr[0]=“你好”;
Debug.WriteLine(arr[0]);
Debug.WriteLine(baseArray[1]);
输出

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

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

公共类Foo
{
公共字符串条{get;set;}
}
Foo[]基数组=
{
新Foo{Bar=“a”},
新Foo{Bar=“b”},
新Foo{Bar=“c”},
新Foo{Bar=“d”},
新Foo{Bar=“e”},
新Foo{Bar=“f”}
};
var arr=baseArray[1..^2];
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);
arr[0].Bar=“你好”;
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);
arr[0]=newfoo{Bar=“World”};
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);
这个输出

b
b
hello
hello
World
hello
数组中的对象不会被复制,而是被引用

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

请自己尝试:

string[]baseArray={“a”、“b”、“c”、“d”、“e”、“f”};
var arr=baseArray[1..^2];
Debug.WriteLine(arr[0]);
Debug.WriteLine(baseArray[1]);
arr[0]=“你好”;
Debug.WriteLine(arr[0]);
Debug.WriteLine(baseArray[1]);
输出

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

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

公共类Foo
{
公共字符串条{get;set;}
}
Foo[]基数组=
{
新Foo{Bar=“a”},
新Foo{Bar=“b”},
新Foo{Bar=“c”},
新Foo{Bar=“d”},
新Foo{Bar=“e”},
新Foo{Bar=“f”}
};
var arr=baseArray[1..^2];
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);
arr[0].Bar=“你好”;
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);
arr[0]=newfoo{Bar=“World”};
Debug.WriteLine(arr[0].Bar);
Debug.WriteLine(baseArray[1].Bar);
这个输出

b
b
hello
hello
World
hello
数组中的对象不会被复制,而是被引用


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

您的测试实际上无效。你所做的只是创建结构,而不是使用它们。例如,Linq版本只返回一个
IEnumerable
,但实际上什么都不做。@DavidG好的,谢谢你指出这一点。删除了我的测试用例。然而,最初的问题仍然存在,它是否复制了数组?您的测试并不真正有效。你所做的只是创建结构,而不是使用它们。例如,Linq版本只返回一个
IEnumerable
,但实际上什么都不做。@DavidG好的,谢谢你指出这一点。删除了我的测试用例。然而,最初的问题仍然存在,它是否复制了阵列?