给定以下方法:
static void ChangeArray(params string[] array) {
for (int i = 0; i < array.Length; i++)
array[i] = array[i] + "s";
}
如果我调用它来传递一个字符串数组,这将起作用:
string[] array = {"Michael", "Jordan"} // will become {"Michaels", "Jordans"}
ChangeArray(array);
但如果我使用字符串参数调用它,将无法工作:
string Michael = "Michael";
string Jordan = "Jordan";
ChangeArray(Michael, Jordan); // This will NOT change the values of the variables
我知道编译器会将 Michael 和 Jordan 包装在一个数组中,所以这两种情况的结果不应该相同吗?
最佳答案
你的第二个例子本质上是:
string Michael = "Michael";
string Jordan = "Jordan";
{
var tmp = new string[] {Michael, Jordan};
ChangeArray(tmp);
}
所以;实际上,tmp
被改变了……但是 tmp
之后被丢弃了,所以你什么也看不到。 params
不 模拟 ref
- 它不会对原始变量进行位置更新。或者在代码中,它不是如下:
string Michael = "Michael";
string Jordan = "Jordan";
{
var tmp = new string[] {Michael, Jordan};
ChangeArray(tmp);
Michael = tmp[0];
Jordan = tmp[1];
}
如果您需要它表现得像那样,那么编码它就像那样 - 或者改用带有 ref
参数的重载。
关于C# 使用 params 关键字的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12526049/