关于值类型 跟 引用类型
关于值类型 和 引用类型//VS2013 Codestatic void printarray(string[] S){Console.Write(\nPrint Array:
关于值类型 和 引用类型
//VS2013 Code
static void printarray(string[] S)
{
Console.Write("\nPrint Array:");
foreach (string item in S )
{
Console.Write("{0} ",item);
}
}
static void ChangeArray(string[] So)
{
//So = So.Reverse().ToArray();
So = (So.Reverse()).ToArray();
}
static void ChangeArrayElements(string[] Sor)
{
Sor[0] = "7";
Sor[1] = "6";
Sor[2] = "5";
}
private void button1_Click(object sender, EventArgs e)
{
string[] NumString = { "1", "2", "3", "4", "5", "6", "7" };
printarray(NumString); //output: Print Array:1 2 3 4 5 6 7
ChangeArray(NumString);
printarray(NumString); //Output:Print Array:1 2 3 4 5 6 7
ChangeArrayElements(NumString);
printarray(NumString); //Output:Print Array:7 6 5 4 5 6 7
}
问题:
将字符串数组作为参数传递,为什么 执行 ChangeArray()返回后,数组里面的元素没有改变,而当执行
ChangeArrayElements()返回后,数组里的元素发生了改变?在执行 ChangeArray()时,数组里的
元素也都已经发生改变了的呀? [解决办法]static void ChangeArray(ref string[] So)
{
So = (So.Reverse()).ToArray();
}
否则你确实改变了So的引用,但是你不能改变NumString
好比
int i = 1;
foo(i);
...
void foo(int x) { x = 2; }
你虽然改变了x,但是不影响i。
[解决办法]这里的原因是ChangeArray和ChangArrayElements两个方法不一样。
ChangeArray中只是使用了NumString的内容,所以我想让你迷惑的地方可能是So.Reverse()这个方法,这个方法其实只是使用了So的内容,而不去改变其内容。你可以去看看msdn.
ChangeArrayElements则很显示是改变了数组的内容。
[解决办法]因为(So.Reverse()).ToArray();实际上又创建了一个新的数组,原本传进函数的So在被(So.Reverse()).ToArray()赋值后就指向了新的数组
[解决办法]路過,看看.
So = (So.Reverse()).ToArray();