2

我在一个方法中有一个 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 数组?

4

3 回答 3

3

数组是对象,所以:引用类型。

它通过值传递引用。因此:如果您更改引用指向的内容(即数组数据),则该更改对于同样引用同一对象的每个人仍然可见。

这里只有一个数组;从字面上看,没有其他数据可以更改。

仅当您将引用重新分配给不同的对象时,通过引用传递引用才有意义。

于 2019-05-10T15:23:28.413 回答
1

由于数组是一种引用类型,如果您不想影响原始值,则需要制作数组的副本。

为此,请将您的 Reverse 方法更新为:

private char[] Reverse(char[] someChars)
    {
        char[] cloneArray = someChars.Clone() as char[];
        Array.Reverse(cloneArray);
        return cloneArray;
    }
于 2019-05-10T15:47:58.917 回答
1

数组是引用类型(根据 .NET,它们是一种对象)。当您调用您的例程时,您将返回相同的引用,并且只是更改其中元素的顺序。

如果您希望它不影响原始结果,请在反转结果之前复制数组。

于 2019-05-10T15:25:04.323 回答