【问题标题】:C# Array.Reverse reversing the original array passed by value to methodC# Array.Reverse 反转按值传递给方法的原始数组
【发布时间】:2019-05-10 15:20:30
【问题描述】:

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

【问题讨论】:

  • 为什么您的引用类型参数标记为ref,而您却从未分配给它们?你了解ref 的含义以及引用类型是什么吗?
  • 因为它是我使用的临时对象,但即使我们想象 someObject 参数不存在,结果也可能是一样的。
  • 该方法反转其设计以修改作为参考传递给它的数组 (docs.microsoft.com/en-us/dotnet/api/…)。如果你希望确保原始不受影响,那么克隆数组,反转克隆的数组,并返回这样的克隆。
  • 试试char[] clone = (char[]) Array.Clone(someChars);。然后是Array.Reverse(clone);,最后是return clone;

标签: c# arrays array-reverse


【解决方案1】:

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

它通过值传递一个引用。因此:如果您更改了 reference 指向的内容(即数组数据),那么 每个也引用同一对象的人仍然可以看到该更改

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • “数组总是通过引用传递”——这是非常模糊的,因为“引用”在这种情况下有两个不同的含义;数组是对象,接触对象的局部变量/字段/参数等的值引用,但这些参数几乎总是按值传递,而不是按引用传递 - 所以说“通过引用传递”是......无益的IMO;在问题中显示的代码的情况下,值 is 是一个引用,它是通过 by value 传递的
    • 我接受这可能更清楚,我会稍微编辑一下文本
    【解决方案3】:

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

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

    private char[] Reverse(char[] someChars)
        {
            char[] cloneArray = someChars.Clone() as char[];
            Array.Reverse(cloneArray);
            return cloneArray;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 2016-10-07
      • 2018-11-01
      • 2011-06-23
      • 1970-01-01
      • 2021-02-07
      相关资源
      最近更新 更多