C# Array.Reverse 反转按值传递给方法的原始数组
C# Array.Reverse reversing the original array passed by value to method
我在一个方法中有一个 char 数组,someObject 是一个通过引用传递给 GetChars 方法的任意对象:
private void DoSomeStuff(ref Object someObject)
{
char[] chars = GetChars(ref someObject); // {'a','b','c','d'}
char[] ReversedChars = Reverse(chars); // {'d','d','b','a'}
//chars and ReversedChars are in the same order, although "ref" is not used
}
private char[] Reverse(char[] someChars)
{
Array.Reverse(someChars);
return someChars;
}
为什么 Array.Reverse 在另一种方法中更改原始传递的 char 数组,如果不是通过引用传递它?
数组是对象,所以:reference-types.
它正在按值传递引用。因此:如果您更改 引用指向 的内容(即数组数据),该更改仍然对 也引用同一对象的每个人可见.
这里只有一个数组;几乎没有其他数据可以更改。
仅当您将引用重新分配给其他对象时,传递引用by-reference才有意义。
数组是引用类型(根据 .NET,它们是一种对象)。当您调用您的例程时,您将返回相同的引用,并且只是更改其中元素的顺序。
如果您不希望它影响原始结果,请在反转结果之前复制数组。
由于数组是引用类型,如果不想影响原始值,则需要复制数组。
为此,将您的 Reverse 方法更新为:
private char[] Reverse(char[] someChars)
{
char[] cloneArray = someChars.Clone() as char[];
Array.Reverse(cloneArray);
return cloneArray;
}
我在一个方法中有一个 char 数组,someObject 是一个通过引用传递给 GetChars 方法的任意对象:
private void DoSomeStuff(ref Object someObject)
{
char[] chars = GetChars(ref someObject); // {'a','b','c','d'}
char[] ReversedChars = Reverse(chars); // {'d','d','b','a'}
//chars and ReversedChars are in the same order, although "ref" is not used
}
private char[] Reverse(char[] someChars)
{
Array.Reverse(someChars);
return someChars;
}
为什么 Array.Reverse 在另一种方法中更改原始传递的 char 数组,如果不是通过引用传递它?
数组是对象,所以:reference-types.
它正在按值传递引用。因此:如果您更改 引用指向 的内容(即数组数据),该更改仍然对 也引用同一对象的每个人可见.
这里只有一个数组;几乎没有其他数据可以更改。
仅当您将引用重新分配给其他对象时,传递引用by-reference才有意义。
数组是引用类型(根据 .NET,它们是一种对象)。当您调用您的例程时,您将返回相同的引用,并且只是更改其中元素的顺序。
如果您不希望它影响原始结果,请在反转结果之前复制数组。
由于数组是引用类型,如果不想影响原始值,则需要复制数组。
为此,将您的 Reverse 方法更新为:
private char[] Reverse(char[] someChars)
{
char[] cloneArray = someChars.Clone() as char[];
Array.Reverse(cloneArray);
return cloneArray;
}