• 值类型与引用类型总结


    下面是我关于值类型与引用类型的一些思考,错误之处肯定有的,欢迎高人批评指正,帮助进步

    C#中,值类型和引用类型是两个非常重要的概念,下面尽量详细的阐述,观点不一定完全正确,欢迎批评指正。

    1.内存分为堆和栈,值类型的数据存储在栈中,引用类型的数据存储在堆中。

    2.int numb=10,代码中的10是值类型的数据,numb只是一个指向10的变量而已。其中10存储在栈中,变量numb也存储在栈中。

    3.Person p=new Person(),代码中 new Person()所创建的对象存储在堆中,变量p存储在栈中。

    4.综合第2点和第3点所有变量都存储在栈中,无论此变量存储的值是值类型和引用类型。

    5.值类型包括枚举,结构以及像int,datetime这样的简单类型;引用类型包括类,接口,委托等。

    6.值类型传递的值的拷贝,引用类型传递的是值的引用,即此数据在内存中的地址,这是最核心的概念,实例展示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class Program
            {
                static void Main(string[] args)
                {
                    Person yaohongbo = new Person() { Name = "姚宏波", Age = 29 };
                    Person lilei = new Person() { Name = "李雷", Age = 22 };
         
                    int age = yaohongbo.Age;
                    yaohongbo.Age = 27;
         
                    Person zhangsan = lilei;
                    lilei.Name = "李磊";
         
                    Console.WriteLine("yaohongbo的age:"+yaohongbo.Age);
                    Console.WriteLine("age:" + age);
                    Console.WriteLine("lilei的name:" + lilei.Name);
                    Console.WriteLine("zhangsan的name:" + zhangsan.Name);
                    Console.ReadKey();
                }
            }
            class Person
            {
                 
                public string Name { get; set; }//引用类型
                public int Age { get; set; }//值类型
            }

    输出结果如下图:

    代码说明:yaohongbo.Age是int类型,为值类型,所以代码int age=yaohongbo.Age,是将yaohongbo.Age变量存储的值复制了一份,然后让变量age存储这份拷贝,此拷贝和yaohongbo.Age无任何关系,所以我们才可以看到上面的输出结果。

    再看代码:

    1
    2
    Person zhangsan = lilei;
          lilei.Name = "李磊";

    Person为自定义类,为引用类型,而引用类型穿的是引用,变量zhangsan指向的数据和变量lilei是同一个内存地址,即同一个对象,而不是像值类型那样,拷贝了一份变量lilei指向的数据给变量zhangsan。所以才会出现无论更改zhangsan韩式lilei的属性值,其他一个都会改变的情况。

    最后通过一张图来描述上面代码。

  • 相关阅读:
    分布式架构高可用架构篇_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试
    @interface [SpringMVC+redis]自定义aop注解实现控制器访问次数限制
    ActiveMQ安装与持久化消息
    activemq 5.13.2 jdbc 数据库持久化 异常 找不到驱动程序
    java通过Comparable接口实现字符串比较大小排序的简单实例
    微信小程序--火车票查询
    【调试】如何使用javascript的debugger命令进行调试(重要)
    【调试】js调试console.log使用总结图解(重要)
    ajax提交表单
    一个项目的404错误处理页面
  • 原文地址:https://www.cnblogs.com/keyyang/p/3953049.html
Copyright © 2020-2023  润新知