为什么ArrayCalledWithOrderBy
不会更改原始传递的数组,但ArrayCalledWithSort
会这样做?
编辑:至于建议重复的链接。一个链接甚至没有OrderBy,所以它显然不重复。另一个链接实际上是询问哪个是OrderBy和Sort之间更好的选择,而不是为什么没有更改原始数组。
public static void ArrayCaller()
{
var arr = new string[] { "pink", "blue", "red", "black", "aqua" };
DisplayArray(arr, "Before method calls");
ArrayCalledWithOrderBy(arr);
DisplayArray(arr, "After method call using orderby");
ArrayCalledWithSort(arr);
DisplayArray(arr, "After method call using sort");
}
public static void ArrayCalledWithOrderBy(string[] arr)
{
// this does not change the original array in the calling method. Why not?
arr = (arr.OrderBy(i => i).ToArray());
DisplayArray(arr, "After orderby inside method");
}
public static void ArrayCalledWithSort(string[] arr)
{
// this changes the original array in the calling method.
// Because it is using the same reference?
// So the above code for orderby does not?
Array.Sort(arr);
DisplayArray(arr, "After sort inside method");
}
public static void DisplayArray(string[] arr, string msg)
{
for (int i=0; i<arr.Length; i++)
{
Console.Write($"{arr[i]} ");
}
Console.WriteLine($" - {msg}");
}
// OUTPUT
//pink blue red black aqua - Before method calls
//aqua black blue pink red - After orderby inside method
//pink blue red black aqua - After method call using orderby
//aqua black blue pink red - After sort inside method
//aqua black blue pink red - After method call using sort
答案 0 :(得分:3)
数组是引用类型,因此将数组传递给方法时。其引用由值传递。
您应该知道此方法中的arr
:
public static void ArrayCalledWithOrderBy(string[] arr)
{
arr = (arr.OrderBy(i => i).ToArray());
DisplayArray(arr, "After orderby inside method");
}
和arr
在这里:
var arr = new string [] {&#34; pink&#34;,&#34; blue&#34;,&#34; red&#34;,&#34; black&#34;,&#34 ; AQUA&#34; }; DisplayArray(arr,&#34;在方法调用之前&#34;);
ArrayCalledWithOrderBy(ARR);
两个不同的变量是否包含对同一个数组的引用,直到这一行:
arr = (arr.OrderBy(i => i).ToArray());
在此行中,您更改arr
以引用已排序的数组,而不是传入的数组。请参阅? OrderBy
创建一个已排序的新数组。原始数组没有变异。
Array.Sort
改变传入的数组,因此它实际上改变了arr
:
var arr = new string[] { "pink", "blue", "red", "black", "aqua" };
答案 1 :(得分:1)
在这一行:
arr = (arr.OrderBy(i => i).ToArray());
您正在创建一个新数组并分配给arr
。传递给该函数的数组不再可由该函数访问。如果您希望能够修改数组arr
以便其他函数可以使用它,则需要使用ref
keyword:
public static void ArrayCalledWithOrderBy(ref string[] arr)
答案 2 :(得分:0)
您可以使用Object.ReferenceEquals来检查arr的引用是否在调用arr.OrderBy(i =&gt; i).ToArray()之后发生了变化。
public static void ArrayCalledWithOrderBy(string[] origin)
{
var arr = (origin.OrderBy(i => i).ToArray());
//isEqual flag is false
var isEqual = Object.ReferenceEquals(arr, origin);
DisplayArray(arr, "After orderby inside method");
}