zoukankan      html  css  js  c++  java
  • 引用类型与值类型在编码上的区别

    一、引入类型与值类型简介

      值类型:直接存放于栈中,取的时候是直接取得值。值类型继承自System.ValueType。(自定义对象)

      引用类型:存在于托管堆中,取的时候是从栈取该对象的地址,然后用这个地址去托管堆中取值。引用类型继承自System.Object。(int,bool,struct)

    二、在代码编写上的区别

      在赋值的时候,值类型是复制一份,新的和旧的在以后的操作中互不影响,而引用类型复制的只是地址,在以后的修改中,修改新的旧的也会受到影响。

      代码示例:

    复制代码
        static void Main(string[] args)
        {
            List<Person> ListPerson = new List<Person>();
            ListPerson.Add(new Person(){ Name="刘备" });
            ListPerson.Add(new Person(){ Name="关羽" });
    
            List<Person> ListPerson2 = ListPerson.Where(m => m.Name == "刘备").ToList();
            ListPerson2[0].Name = "曹操";
    
            foreach(Person p in ListPerson)
            {
                Console.WriteLine(p.Name);  //输出曹操  关羽  (对于刚开始Name="刘备的Person",只存在一份,怎么改,改的都是那个)
            }
    
            List<int> ListInt = new List<int>();
            ListInt.Add(1);
            ListInt.Add(2);
    
            List<int> ListInt2 = ListInt.Where(m => m > 1).ToList();
            ListInt2[0] = 5;
    
            foreach (int i in ListInt)
            {
                Console.WriteLine(i);  //输出1 2 值类型,改变了ListInt2[0]的那个值,就只是改变了那个值,对原有List没影响
            }
    
            Console.ReadKey();
        }
    复制代码

       示例2:

    复制代码
            static void Main(string[] args)
            {
                int i = 1;
                geti(i);
    
                Console.WriteLine(i);   //输出 1
    
                Person p = new Person() { Name = "琴" };
                getP(p);
    
                Console.WriteLine(p.Name);  //输出 琴琴
    
                Console.ReadKey();
            }
    
            public static void getP(Person p)
            {
                p.Name = p.Name + p.Name;
            }
    
            public static void geti(int i)
            {
                i = i + i;
            }
    复制代码

      引用类型由于调用参数时传递的是地址,所以对这个地址的修改会影响到原有对象。如果希望值类型与引用类型一样也有影响,那么就只有用ref传参了。俗称,引用传递。

  • 相关阅读:
    Hadoop命令大全
    Cube中时间维度
    无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
    IE6、IE7、IE8、FF对空标签块状元素解释的不同点
    SSIS导出平面文件数据带_x003C_none_x003E的问题
    用DB2 Runtime Client实现Apache Derby 数据库ODBC编程
    区块链技术探索
    JS原型对象
    this关键字
    消息认证码
  • 原文地址:https://www.cnblogs.com/zxtceq/p/5461949.html
Copyright © 2011-2022 走看看