引用类型前需要加ref?

断了今生、忘了曾经 提交于 2019-12-05 09:04:26

方法的参数前加ref代表的是传的参数的地址,值类型前加ref的作用相当于把这个值类型当成引用类型在用,那引用类型作为参数有一种情况也需要加ref,不然得到的值会有差。

不加ref:

 class Program
    {
        static void Main(string[] args)
        {

            List<string> list = new List<string> { "a","ab","aaa","bc"};
            TestList(list);
            Console.WriteLine("Main方法里的list现在有{0}个元素",list.Count());
        }
        public static void TestList(List<string> list)
        {
            list = list.Where(p => p.Contains("a")).ToList();
            Console.WriteLine("TestList方法里的list现在有{0}个元素", list.Count());
        }
    }

得到的结果是:

加ref之后:

 class Program
    {
        static void Main(string[] args)
        {

            List<string> list = new List<string> { "a","ab","aaa","bc"};
            TestList(ref list);
            Console.WriteLine("Main方法里的list现在有{0}个元素",list.Count());
        }
        public static void TestList(ref List<string> list)
        {
            list = list.Where(p => p.Contains("a")).ToList();
            Console.WriteLine("TestList方法里的list现在有{0}个元素", list.Count());
        }
    }

 

得到的结果:

假如list的地址是X000,

1.不加ref,传的是list的一个备份,这个备份的地址也是X000,TestList方法中对备份list进行了ToList操作,重新给备份list分配了一个地址叫X001,那list和备份list地址空间不一样了,用X000指向的是list,输出的值自然是list而不是list备份的值。

2.加ref,传的就是x000这个地址的list本身,进行ToList操作之后,list的地址变成了X001,直接改变的是list的地址,输出的值就是改变后的值。

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!