3.1 C#程序是一组类型声明
C程序是一组函数和数据类型
C++程序是一组函数和类
C#程序是一组类型声明
- C#程序或DLL源码是一组一种或多种类型声明
- 对于可执行程序,类型声明中必须有一个包含Main方法的类
- 命名空间是一种把相关类型声明分组并命名的方法
3.2 类型是一种模板
可以把类型想象成一个用来创建数据结构的模板。模板本身不是数据结构,但它说明了由该模板构造的对象的特征。
类型由下面的元素定义:
- 名称
- 用于保存数据成员的数据结构
- 一些行为及约束条件
例:short类型和int类型
3.3 实例化类型
从类型模板创建实际对象,称为实例化类型
- 实例化类型创建的对象称为类型的实例(对象)
- C#程序中,每个数据项都是某类型的实例。类型可以是语言自带的、BCL或其它库提供的,或是程序员定义的
3.4 数据成员和函数成员
- 数据成员:保存了与这个类的对象或作为一个整体的类相关的数据
- 函数成员:执行代码。函数成员定义类型的行为
3.5 预定义类型
C#提供16种预定义类型,包括13种简单类型和3种非简单类型
- 简单类型
- 11种数值类型
- 不同长度的有符号和无符号整数类型
- 浮点数的float和double
- 高精度小数类型decimal(常用于货币计算)
- 一种Unicode字符类型 char
- 一种bool类型,布尔值只能为true或false
- 11种数值类型
- 非简单类型
- string Unicode字符数组
- object 所有其他类型的基类
- dynamic 使用动态语言编写程序集时使用
所有的预定义类型都直接映射到底层的.NET类型。C#类型名称就是.NET类型的别名,
所以可以使用.NET类型名称替代C#类型名,但不鼓励这样做。
3.6 用户定义类型
用户可以自定义6种类型
- class 类类型
- struct 结构类型
- array 数组类型
- enum 枚举类型
- delegate 委托类型
- interface 接口类型
类型通过类型声明创建,类型声明包含以下信息
- 要创建类型的种类
- 新类型名称
- 类型中每个成员的声明(array和delegate除外,它们不含命名成员)
3.7 栈和堆
程序运行时,他的数据必须存储在内存中。一个数据需要多大内存,存储在什么地方,以及如何存储都依赖于该数据项的类型。
运行中程序使用两个内存区域来存储数据:栈和堆
栈
栈是一个LIFO(Last-In First-Out,后进先出)的内存数组。
栈存储以下几种类型数据
- 某些类型变量的值
- 程序当前的执行环境
- 传递给方法的参数
栈的特征
- 数据只能从栈的顶端插入或删除
- 把数据放到栈顶称为入栈(push)
- 从栈顶删除数据称为出栈(pop)
堆
在堆里可以分配大块内存来存储某类型的数据对象。
与栈不同,堆里的内存能以任意顺序存入或移除。
CLR的GC(Garbage Collector,垃圾收集器)自动删除堆上不再访问的数据。
3.8 值类型和引用类型
- 值类型只需要一段单独的内存。
- 引用类型需要两段内存
- 第一段存储实际数据,它总是位于堆中
- 第二段是一个引用,指向数据在堆中的存放位置
存储引用类型对象的成员
如果数据是另一个对象的成员,那么它的存储会有些不同
- 引用类型对象的数据部分始终存放在堆里
- 值类型对象,或引用类型数据的引用部分可以存在堆里,也可以存在栈里,这取决于实际情况
对于一个引用类型,其实例的数据部分始终存放在堆里
C#类型的分类
3.9 变量
变量允许程序存取数据
- 变量是一个名称,表示程序执行时存储在内存中的数据
- C#提供4种变量
变量声明
变量在使用之前必须声明,变量声明定义了变量,并完成了两件事:
给变量命名,并为它关联一种类型;
让编译器为它分配一块内存。
一个简单的变量声明至少需要一个类型和一个名称,下面的声明定义了名称为name的
变量,变量类型为String;
string name;