zoukankan      html  css  js  c++  java
  • 引用类型前需要加ref?

    方法的参数前加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的值

  • 相关阅读:
    Shell编程之运算符和环境变量配置文件
    Shell编程之变量
    PCI BAR设置过程[转]
    基于ARM的SoC设计入门[转]
    负载均衡
    [转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess
    VC/DDK/DriverWorks开发环境配置
    windows下注册表脚本编写
    _cdecl与_stdcall区别
    在C语言中破坏函数调用堆栈
  • 原文地址:https://www.cnblogs.com/xiaoxinstart/p/11917885.html
Copyright © 2011-2022 走看看