C#基础系列--值类型和引用类型 - Ultron Blog
2018/07/27 00:15

C#基础系列--值类型和引用类型

C#中类型的分类

所有类型都可以归为值类型或者引用类型,而这两种类型的区别在于数据复制的方式,值类型数据的复制总是对值进行复制,而引用类型数据的复制则是进行引用复制

值类型

  • 值类型变量直接存储的数据的值
  • 值类型变量声明后,不管是否已经赋值,编译器为其分配内存(在栈中)
  • 值类型变量在复制的时候会直接创建原始变量的副本

引用类型

  • 引用类型的值存储的是对数据存储位置的引用,而不是直接存储数据
  • 引用类型变量声明后,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中
  • 引用类型变量在复制时只会复制引用,而不会复制引用的数据,所以两个不同的变量可以引用相同的数据,此时利用一个变量更改对象的字段,用另一个变量访问对象时也将看到更改的结果

关于string的类型

先来看一个例子

//值类型
int a = 0;
int b = a;
a = 1;
Console.WriteLine("a is {0},b is {1}", a, b);

//引用类型
string s1 = "123";
string s2 = s1;
s1 = "456";
Console.WriteLine("s1 is {0},s2 is {1}", s1, s2);
Console.Read();

执行的结果:

//结果:
a is 1,b is 0
s1 is 456,s2 is 123

从结果上看,string类型也符合值类型的特点,但是并非如此,string是引用类型。实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,这就是string类型的关键特征:字符串是不可变的,可以为string类型变量赋一个新的值,单出于性能方面的考虑,C#没有提供修该字符串内容的机制,这也就能解释上面代码结果了。


Tags:
C#
Stats:
0 条评论
148 次点击   4 次点赞