C#中数组做参数问题

知识点:
值类型:存储于 堆栈中,传递的是“值”。如:基本数据类型、结构、枚举。。
引用类型:存储于 托管堆中,传递的是“引用(地址)”,如:类、OBJECT、字符串、数组 
ref  关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace test
{
    class ArrayClass
    {
        static void PrintArray(string[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : "");
            }
            System.Console.WriteLine();
        }


        static void ChangeArray(string[] arr)
        {
           
 //string[] s = new string[7];
            arr = (arr.Reverse()).ToArray();
//就像蓝色代码所示,新建了一个数组对象s,s指向了arr反转后的数组。
            //s = (arr.Reverse()).ToArray();
            System.Console.WriteLine("reverse:");
            PrintArray(arr); 
            System.Console.WriteLine("arr[0] is {0} in ChangeArray.", arr[0]);
            //System.Console.WriteLine("s[0] is {0} in ChangeArray.", s[0]);


           // return arr;
        }


        static void ChangeArrayElements(string[] arr)
        {
          //string[] s = new string[7];
            //s[0] = "Sat";
            // s[1] = "Fri";
            //s[2] = "Thu";
           // arr[0] = s[0];
           // arr = s;//C#中数组可以整体赋值?不是,只是指向发生了变化。
            arr[0] = "Sat";
            arr[1] = "Fri";
            arr[2] = "Thu";

            PrintArray(arr);
            System.Console.WriteLine("arr[0] is {0} in ChangeArrayElements.", arr[0]);
        }


        static void Main()
        {
            // Declare and initialize an array.
            string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
            //string[] s = new string[7];
            //s = weekDays;

            System.Console.WriteLine("Initialize:");
            PrintArray(weekDays);
            ChangeArray( weekDays);
            System.Console.WriteLine("Array weekDays after the call to ChangeArray:");
            PrintArray(weekDays); 
            System.Console.WriteLine();

    ChangeArrayElements(weekDays);
            System.Console.WriteLine("Array weekDays after the call to ChangeArrayElements:");
            PrintArray(weekDays);
        }
    }
}
红字标识部分-----ChangeArray() 没有改变 原数组的值。而ChangeArrayElements()方法改变了原数组的值。
1.开始我没理解过来的是数组是引用型类型,因此方法可以更改元素的值。
可是两个方法传递的都是数组类型。
2.函数调用的时候就像新建了一个数组对象arr,这个对象是WeekDays的复制版,同样指向 string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };这个建立的时候开辟出来的内存。
而ChangeArray()方法的这句话 arr = (arr.Reverse()).ToArray();开辟出来另一块空间,而arr不指向WeekDays开辟出来的内存了,而是指向了这句话开辟出来的内存。
ChangeArrayElements()呢,arr的指向并没有改变, 
s[0] = "Sat";
s[1] = "Fri";
s[2] = "Thu";这三句话是把string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };这个建立的时候开辟出来的内存里面的内容改变了。所以在后来访问的时候Weekdays的值发生了变化。
要实现ChangeArray()方法中arr的指向不发生改变,就这样操作ChangeArray(ref string[] arr),这样就把WeekDays所开辟出来的内存一并传递给了ChangeArray()方法,所有的操作也会在那片内存中进行
参考:
感谢caozhy,Mr.song

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值