C#笔记03 类型、存储和变量
——C#程序是一组类型声明
1. 类型是一种模版
学习C#就是学习如何创建和使用类型。可以把类型想象成一个用来创建数据结构的模版。模版本身并不是数据结构,但它详细说明了由该模版构造的对象的特征。———人民邮电出版社《C#2008 C#图解教程》
类型由下面的元素定义:
- 名称
- 用于保存数据成员的数据结构
- 一些行为及约束条件
2. 实例化类型
从某个类型模版创造实际的对象称为实例化该类型
C#中,每个数据项都是某种类型的实例。 这些类型可以是
- 语言自带的
- BCL或其他库提供的
- 程序员定义的(class)
3. 数据成员和函数成员
short、int和long等类型称为简单类型。这种类型只能存储一个数据项。
其他的类型可以存储多个同类型的数据项。
另外一些类型可以包含许多不同类型的数据项,这些类型中的数据项个体称为成员,有两种成员: 数据成员和函数成员:
- 数据成员保存了与这个类的对象或类本身相关的数据。
- 函数成员执行代码。函数成员定义类型的行为。
4. 预定义类型
C#提供了15种预定义类型,其中包括13种简单类型和2种非简单类型。
所有预定义类型的名称都由全小写的字母组成。预定义的简单类型包括:
- 8种整数类型
类型 | 含义 | .NET框架类型 | 允许的值 |
---|---|---|---|
sbyte | 8位有符号整数 | System.SByte | 在–128~127之间的整数 |
byte | 8位无符号整数 | System.Byte | 在0~255之间的整数 |
short | 16位有符号整数 | System.Int16 | 在–32768~32767之间的整数 |
ushort | 16位无符号整数 | System.UInt16 | 在0~65535之间的整数 |
int | 32位有符号整数 | System.Int32 | 在–2147483648~2147483647之间的整数 |
uint | 32位无符号整数 | System.UInt32 | 在0~4294967295之间的整数 |
long | 64位有符号整数 | System.Int64 | 在–9223372036854775808~9223372036854775807之间的整数 |
ulong | 64位无符号整数 | System.UInt64 | 在0~18446744073709551615之间的整数 |
*字节是二进制数据的单位。一个字节通常8位长
“u”是unsigned的缩写,表示不能在这些类型的变量中存储负数
- 3种浮点类型
类型 | 含义 | .NET框架类型 | m的最小值 | m的最大值 | e的最小值 | e的最大值 | 近似的最小值 | 近似的最大值 |
---|---|---|---|---|---|---|---|---|
float | 单精度浮点数 | System.Single | 0 | 2^24 | –149 | 104 | 1.5×10^-45 | 3.4×10^38 |
double | 双精度浮点数 | System.Double | 0 | 2^53 | –1075 | 970 | 5.0×10^-324 | 1.7×10^308 |
decimal | 28位数字精度 | System.Decimal | 0 | 2^96 | –28 | 0 | ±1.0×10^28 | ±7.9×10^28 |
*前两种可以用+/- m×2e的形式存储浮点数,decimal使用另一种形式:+/- m×10e
- 2种非数值类型
类型 | .NET框架类型 | 允许的值 |
---|---|---|
char | System.Char | U+0000~U+ffff,一个Unicode字符,存储0~65535之间的整数 |
bool | System.Boolean | 布尔值,true或false |
*Unicode编码:Unicode为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode编码共有三种具体实现,分别为UTF-8,UTF-16,UTF-32,其中UTF-8占用一到四个字节,UTF-16占用二或四个字节,UTF-32占用四个字节。
- 其他2种非简单类型
类型 | 含义 | .NET框架类型 |
---|---|---|
object | 所有其他类型的基类 | System.Object |
string | Unicode字符序列 | System.String |
5. 用户定义类型
除了15种预定义类型,还可以创建自己的用户定义类型,有6种类型:
- 类类型(class)
- 结构类型(struct)
- 数组类型(array)
- 枚举类型(enum)
- 委托类型(delegate)
- 接口类型(interface)
类型通过类型声明创建,类型声明包含以下信息:
- 要创建的类型的种类
- 新类型的名称
- 对类型中每个成员的声明 〈名称和规格) 。array和delegate类型除外,它们不含有命名成员
一旦声明了类型,就可以创建和使用这种类型的对象,就像它们是预定义类型一样。
*定义类型只需要进行实例化,用户定义类型需要两步, 声明和实例化。
6. 栈和堆
栈是一个内存数组,是一个LIFO (last-in first-out,后进先出) 的数据结构。 栈存储几种类型的数据:
- 某些类型变量的值
- 程序当前的执行环境
- 传递给方法的参数
栈有如下几个普遍特征
- 数据只能从栈的顶端插入和删除
- 把数据放到栈顶称为入栈 (push)
- 从栈顶删除数据称为出栈 (pop)
堆是一块内存区域,在堆里可以分配大块的内存用于存储某类型的数据。与栈不同,堆里的内存可以任意顺序存入和移除
7. 值类型和引用类型
数据项的类型定义了存储数据需要的内存大小、组成该类型的数据成员以及该类型能执行的函数。类型还决定了对象在内存中的存储位置——栈或堆
- 值类型:只需要一段内存,存储实际的数据
- 引用类型:需要一段存储实际的数据,一段引用(存放在栈中),指向数据在堆中存放的位置
8. 变量
变量是一个名称,表示程序执行时存储在内存中的数据。
变量在使用之前必须声明。即给变量指定名称和类型,让编译器为它分配一块内存
<type> <name>;
多重变量声明:把多个相同类型的变量声明在一条单独的声明语句中,用逗号隔开
例:
int var1 = 6, var2 = 4, var3 = 5;