首页 > 代码库 > 理解C#系列 / 核心C# / 数据类型

理解C#系列 / 核心C# / 数据类型

数据类型

数据类型

C#把数据类型分为两种:值类型和引用类型。

值类型和引用类型

值类型的变量直接指向存储的值,引用类型的变量指向值的引用。[理解:引用就像一个柜子的号码牌,可以顺藤摸瓜找到柜子。假如你再次对一个值类型的变量赋值,那么就会改变值,假如你再次对一个引用类型的变量赋值,那么就只是换了一个号码牌,指向了其他的柜子,对前一个柜子是不做修改的。]

这两种类型的数据存储在内存的不同地方,值类型数据存储在堆栈中,而引用类型的数据(值的引用)存储在托管堆上。

在使用的时候的区别

int i=20;int j=i;

int定义整数类型的变量,整数类型属于值类型,j在赋值的时候复制了i的值,所以这会在内存的两个地方存储值20,如果改变其中一个,不会影响另外一个。

Apple a = new Apple();a.color = "red";Apple b = a;b.color = "green";

Apple是我们定义的苹果类型,我们用new Apple()创造了一个实际的苹果,并用引用类型的变量a指向了这个创造的苹果。

在第二行设定了苹果的颜色是红色。

在第三行我们添加了一个新变量,赋值了a这个引用类型的数据,所以b也是指向了a指向的那个苹果,并没有产生第二个苹果。

在第四行,我们修改b指向的苹果的颜色为绿色,这时候实际上查看a.color也会发现苹果的颜色是绿色了,因为始终就只有一个苹果呀。

Apple a = null;

这表示让一个苹果类型的变量不指向任何实际的苹果,如果你想使用这个变量a代表的实际的苹果,就会报错,因为没有东西呀,怎么能使用呢。值类型的变量就不可以赋值null,这是引用类型的专利。

当已经没有任何一个变量指向某个实例的时候,这个实例就不能被访问到了,CLR的垃圾收集器会定期找寻这样的实例,删除它们,把它们占用的内存返回给操作系统。

预定义数据类型

C#有15个预定义类型,其中13个是值类型,两个是引用类型(string和object)

13个值类型中有8个整型:{分正负的:8位sbyte,16位short,32位int,64位long}{无符号的:8位byte,16位ushort,32位uint,64位ulong}。

13个值类型中有2个浮点类型:{float:32位单精度浮点数}{double:64位双精度浮点数}。

13个值类型中还有:{decimal:通常用于财务计算的128位高精度十进制表示法}{bool:用于包含布尔值true或false}{char:为了保存单个字符的值}。

值类型的赋值方法:

int i = 1234;uint ui = 1234U;long l = 1234L;long x = 0x12ab;//用16进制赋值需添加0x前缀ulong ul = 1234UL;float f = 12.3Fdouble d = 12.3;decimal d = 12.30M;bool b = true;char c = A;char c = \n;//转义符

2个预定义的引用类型:{object:根类型,面向对象概念}{string:字符串类型,但拥有许多值类型的特性,使它常被误认为值类型}

理解C#系列 / 核心C# / 数据类型