C#提供了16中预定义类型,包括13种简单类型和3种非简单类型。
13种简单类型
- 11种数值类型:其中decimal用于金融方面的货币计算。
- 1种Unicode字符类型char。
- 1种布尔类型bool
3种非简单类型
- string:一个Unicode字符数组。
- object:是所有其他任何类型的基类。
- dynamic:使用动态语言编写的程序集时使用
C#提供的16种预定义类型,如下图所示,图片来自于《C#4.0图解教程》p22。
C#提供的16种预定义类型
除了C#提供的16种预定义类型,开可以创建自己的用户定义类型(事实上,写C#程序就是创建自己的用户定义类型的过程),它们是:
- 数组类型:Array
- 类类型:class
- 结构类型:sturcture
- 枚举类型:enum
- 委托类型:delegate
- 接口类型:interface
存储
程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方以及如何存储都依赖于该数据项的类型。
运行中的程序使用两个内存区域来存储数据:堆和栈。
栈:
系统接管所有的栈操作。作为程序猿,不需要显式地对它做任何事情。栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构。只能对栈顶的(最后进入的)的数据进行删除,栈可以来存储以下几种类型的数据:
- 某些类型变量的值;
- 程序当前的执行环境;
- 传递给方法的参数。
堆:
堆是一块内存区域,在堆里可以分配大块的内存用于存储某类型的数据对象。与栈不同,堆的内存能够以任一顺序存入和删除。
虽然程序可以在堆里保存数据,但并不能显式地删除它们。CLR的自动GC(Garbase Collector,垃圾收集器)会自动清除无主的堆对象。
值类型和引用类型
数据项的类型定义了存储数据需要的内存大小及组成类型的数据成员。
类型还决定了对象在内存中的存储位置——堆或栈。
C#的类型分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。
值类型只需要一段单独的内存,用于存储实际的数据。
引用类型需要两段内存:
-
第一段存储实际的数据,它总是位于堆中。
-
第二段是一个引用,指向数据在队中的存放位置。
so,值类型的数据存放在栈中。引用类型的实际数据也存放在堆中,但是引用存放在栈里。
如果一个自定义类型中包含值类型或者引用类型时,作为数据成员的类型怎样存放:分两种情况。
1. 引用类型中包含值类型或/和引用类型成员,存放如下:不管成员是引用类型还是值类型,所有成员总是包含在堆里。
2. 值类型中包含值类型或/和引用类型成员:依赖于实际环境。
那么在C#中的16中预定义类型和6种自定义类型中有哪些是值类型,那些是引用类型呢,如下图所示:
注意的是:string是引用类型而不是值类型,所以它实际数据存储在堆里,引用存储在栈里。
变量
编程语言必须允许程序存取数据,而这这是通过变量来实现的。
1.变量是一个名称,用来表示程序执行时存储在内存中的数据。
2.C#提供了4种变量:
变量在使用之前必须声明。变量声明完成两件事:
1.给变量命名,并为它关联一种类型;
2.让编译器为它分配内存。
变量声明后,应该初始化或者自动初始化。
每个变量都包含变量类型。目的是编译器可以确定运行时需要的内存重量以及哪些部分应该存在栈上,哪些部分存在堆上。变量的类型在编译的时候确定并且在运行时不能修改————这叫做静态类型。