C#按引用传递数组

问题描述 投票:0回答:1

我知道有非常相似的问题,但我需要知道在这个特定情况下发生了什么。我编写了一个函数来反转特定维度的多维数组的项目。为此,我将多维数组转换为锯齿状数组,然后以递归方式查找执行反转的数组维。

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}}

不应该通过引用传递数组吗?为什么在本地赋值之后我的输入数组引用了orignal指针而不是指定的?我应该使用ref关键字进行数组参数吗?如果是,是否可以继续使用此方法作为Array类型的扩展?

c# arrays pass-by-reference
1个回答
3
投票

除out和ref修饰符之外的函数参数中的所有引用/值都可以被视为仅局部变量(但是,您仍然可以更改引用对象内的值)。

在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(...);
© www.soinside.com 2019 - 2024. All rights reserved.