一:C#把数据类型分为值类型和引用类型
1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用。
1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上。存储位置的不同会有不同的影响。
例如int类型是值类型:int x,y; x=10;y=x;y=20;前三个语句会在内存的两个地方存储值10。改变y的值不会影响x。
如果已经定义了一个类Test,Test是一个引用类型,有一个int类型的成员变量value,执行完如下代码后,只有一个Test对象。x和y都指向包含该对象的内存位置,申明这两个对象只保留一个引用而不会实例化给定类型的对象。创建对象必须使用new关键字。由于x和y引用同一个对象,所以对y的修改会影响x。因此结果为10和20
Test x, y;
x=new Test();
x.Value = 10;
y = x;
Console.WriteLine("X的值为:"+x.Value);
y.Value = 20;
Console.WriteLine("X的值为:" + x.Value);
Console.ReadKey();
二:CTS类型
2.1C#认可的基本预定义类型没有内置于C#语言中,而是内置于.NETFramework中,例如申明一个int类型的数据时,实际上是System.Int32的一个实例,其意义在于可以把所有的基本数据类型看成支持某些方法的类。例如把int i转换为string,可以使用string s = i.ToString();
引用类型和值类型都继承自System.Object类。不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType。
预定义的值类型包括整形、浮点类型,decimal类型,bool类型,字符类型等。预定义的引用类型 根类型Object类型,string类型。
2.2 string类型,string类型是引用类型,但是与引用类型常见的行为有一些区别。字符串是不可改变的,修改其中一个字符串就会创建一个全新的string对象,而另一个字符串不发生变化。string类型的很多操作反而看起来和值类型相似,例如:
三:关于值类型和引用类型判断是否相等。
3.1 当比较两个值类型时,进行的是内容比较;而比较两个引用类型时,进行的是引用比较。示例如下:
3.2 string 是一个例外,string比较可以直接使用==或Equal(),CLR对string类型的比较会比较其值而不是引用。这点看起来更像是值类型的特性,而实际上是重载了运算符 "==" 和方法Equals ,系统解析的时候会直接比较String 的内容。
关于值类型和引用类型的值传递和引用传递可看下一篇: