c# - C#通过引用传递数组
问题描述
我知道有非常相似的问题,但我需要知道在这种特定情况下发生了什么。我编写了一个函数来沿特定维度反转多维数组的项。为此,我将多维数组转换为锯齿状数组,然后递归地找到执行反转的数组维度。
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
类型的扩展?
解决方案
除了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(...);
推荐阅读
- javascript - Toast 消息打不开
- android - 通过单击按钮更改文本使用带有 onclicklistener 的 arraylist 来设置 arraylist 中的下一个 textView
- sparql - Sparql,如何从实体中选择属性
- firebase - 我是否需要在 firebase 中存储加密的个人详细信息
- sql - 在 Oracle Pivot 的 IN 代码中使用子查询
- html - 某些带有 chrome 的 iOS 设备上的 CSS Box-shadow 工件
- oauth - Ejabberd Oauth:访问被拒绝
- python-3.x - TensorFlow TPU 培训。InvalidArgumentError:未声明的 TPU 计算输出
- python - 如何增加标签间距以避免networkx图中的标签重叠
- python - python没有使用绝对路径创建带有w+的文件