代码之家  ›  专栏  ›  技术社区  ›  PrinceOfBorgo

C#通过引用传递数组

  •  0
  • PrinceOfBorgo  · 技术社区  · 7 年前

    我知道有非常相似的问题,但我需要知道在这个具体的案例中发生了什么。我编写了一个函数来沿特定维度反转多维数组的项。为此,我将多维数组转换为锯齿数组,然后递归地找到执行反转的数组维度。

    public static void Reverse(this Array array, int dimension, int start, int end)
    {
        object[] jag = array.ToJaggedArray();
    
        if (!jag.ReverseAux(0, dimension, start, end))
            throw new ArgumentOutOfRangeException("dimension", dimension, "Dimension must be nonnegative and less than array dimensions number.");
    
        array = jag;
    }
    

    现在我的问题是,当我运行这个方法时,我的输入数组并没有被修改。数组不应该通过引用传递吗?当我分配 array = jag 为什么它在方法内部而不是外部被正确分配?

    // create 2D array of strings
    string[,] ar = {{"00", "01", "02"},
                    {"10", "11", "12"},
                    {"20", "21", "22"}};
    // reverse the first dimension (rows)
    ar.Reverse(0, 0, 2);
    // show the result
    MessageBox.Show(ar.ToString(null, null));
    

    输出是 {{00, 01, 02}, {10, 11, 12}, {20, 21, 22}} 这正是原始数组。如果我签入输出 Reverse 方法

    public static void Reverse(this Array array, int dimension, int start, int end)
    {
        //...
    
        array = jag;
        System.Windows.Forms.MessageBox.Show(array.ToString(null, null));
    }
    

    这显示了正确的反向数组 {{20, 21, 22}, {10, 11, 12}, {00, 01, 02}} .

    ref 数组参数的关键字?如果是,是否可以继续使用此方法作为 Array

    1 回复  |  直到 7 年前
        1
  •  3
  •   eocron    7 年前

    函数参数中的所有引用/值 裁判 修饰符可以被认为是单独的 变量(不过,您仍然可以更改引用对象内的值)。

    在C#中,我们使用这样的扩展方法,所以它看起来像是无状态扩展方法:

    public static Array Reverse(this Array array, int dimension, int start, int end)
    {
        object[] jag = array.ToJaggedArray();
    
        if (!jag.ReverseAux(0, dimension, start, end))
            throw new ArgumentOutOfRangeException("dimension", dimension, "Dimension must be nonnegative and less than array dimensions number.");
    
        return jag;
    }
    
    var output = input.Reverse(...);