C# 使用索引/范围切片数组是否会创建数组的副本
随着C#8.0看到结构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
索引
和范围
的引入,我们现在可以很容易地获得一个数组的切片,如下所示
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好的,谢谢你指出这一点。删除了我的测试用例。然而,最初的问题仍然存在,它是否复制了阵列?