C#中的值类型和引用类型

存储位置

1.值类型的变量以及其值都存放在栈上面的。

以图所示,值类型num_a 的值修改并不会影响或原有的变量num_b 。

            int num_a = 3;//num_a 是值类型,变量跟值都存放在栈中。栈中存放示例:num_a = 3
            int num_b = num_a;//num_b 是值类型,变量跟值都存放在栈中。栈中存放示例:num_b = 3.即另外在栈内存开辟新的内存空间
            num_a = 4;
            Console.WriteLine(num_b);//输出结果为3

2.引用类型的变量存储在栈上面,其值则放在堆上面。

如上图代码,stu_a与stu_b指向堆上面的同一个地址,所以当stu_a修改后,stu_b相应也会发生变化。

           public class Student
            {
              public string Name { get; set; }

              public Student(string name)
              {
                this.Name = name;
              }
            }


            var stu_a = new Student("张三");
            var stu_b = stu_a;
            Console.WriteLine(stu_b.Name);//stu_b 输出结果"张三"
            stu_a.Name = "李四";
            Console.WriteLine(stu_b.Name);//stu_b 输出结果"李四"

注意:

字符串string比较特殊这个需要注意,字符窜是引用类型,但是它具有不可变性。如下代码所示:

           //特殊例子 字符串
            string str_a = "代码改变世界";
            string str_b = str_a;
            Console.WriteLine(string.ReferenceEquals(str_a,str_b));//输出true
            str_a = "科技改变生活";
            Console.WriteLine(string.ReferenceEquals(str_a, str_b));//输出false

当修改str_a的值时会创建一个新的字符串对象,并会分配一个新的引用.

所以修改str_a的值后,str_a和str_b的引用就不一致了。

分类:

值类型包括:结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型。
引用类型包括:数组,用户定义的类、接口、委托,object,字符串,数组。

posted @ 2021-11-26 18:36  勇敢肥牛  阅读(166)  评论(0)    收藏  举报