首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于值类型 跟 引用类型

2014-01-03 
关于值类型 和 引用类型//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();

热点排行