C# 提供了一组丰富的基本数据类型(也称为 **内置类型**),这些类型是构建程序的基础。本文将详细解释 C# 中所有基本数据类型的特点、内存占用、取值范围及使用场景。
---
## 目录
1. [数据类型分类](#数据类型分类)
2. [值类型(Value Types)](#值类型value-types)
- 2.1 [整数类型](#整数类型)
- 2.2 [浮点类型](#浮点类型)
- 2.3 [字符类型](#字符类型)
- 2.4 [布尔类型](#布尔类型)
3. [引用类型(Reference Types)](#引用类型reference-types)
- 3.1 [字符串类型](#字符串类型)
- 3.2 [对象类型](#对象类型)
4. [默认值与初始化](#默认值与初始化)
5. [类型转换](#类型转换)
6. [注意事项](#注意事项)
7. [总结](#总结)
---
## 数据类型分类
C# 数据类型分为两大类:
| 类别 | 特点 | 示例 |
| ------------ | ------------------------ | -------------------------- |
| **值类型** | 直接存储数据,分配在栈上 | `int`, `char`, `bool` |
| **引用类型** | 存储数据地址,分配在堆上 | `string`, `object`, `数组` |
---
## 值类型(Value Types)
### 整数类型
| 类型名称 | 关键字 | 内存大小 | 取值范围 | 默认值 | 示例 |
| ------------ | -------- | -------- | ------------------------------------------------------- | ------ | --------------------------------- |
| 有符号字节 | `sbyte` | 1 字节 | -128 到 127 | 0 | `sbyte a = -10;` |
| 无符号字节 | `byte` | 1 字节 | 0 到 255 | 0 | `byte b = 200;` |
| 短整型 | `short` | 2 字节 | -32,768 到 32,767 | 0 | `short c = -3000;` |
| 无符号短整型 | `ushort` | 2 字节 | 0 到 65,535 | 0 | `ushort d = 60000;` |
| 整型 | `int` | 4 字节 | -2,147,483,648 到 2,147,483,647 | 0 | `int e = 1000000;` |
| 无符号整型 | `uint` | 4 字节 | 0 到 4,294,967,295 | 0 | `uint f = 3000000000;` |
| 长整型 | `long` | 8 字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L | `long g = -9000000000000000000;` |
| 无符号长整型 | `ulong` | 8 字节 | 0 到 18,446,744,073,709,551,615 | 0 | `ulong h = 18000000000000000000;` |
**使用场景**:根据数值范围和内存需求选择,如 `int` 是最常用类型。
---
### 浮点类型
| 类型名称 | 关键字 | 内存大小 | 精度 | 默认值 | 示例 |
| ------------ | --------- | -------- | ------------- | ------ | ------------------------------------- |
| 单精度浮点数 | `float` | 4 字节 | 约6-9位小数 | 0.0F | `float a = 3.14F;` |
| 双精度浮点数 | `double` | 8 字节 | 约15-17位小数 | 0.0D | `double b = 3.1415926535;` |
| 高精度小数 | `decimal` | 16 字节 | 28-29位小数 | 0.0M | `decimal c = 1234567890.1234567890M;` |
**使用场景**:
- `float`:对性能敏感的低精度场景(如游戏开发)。
- `double`:通用科学计算(默认选择)。
- `decimal`:财务计算(避免舍入误差)。
---
### 字符类型
| 类型名称 | 关键字 | 内存大小 | 取值范围 | 默认值 | 示例 |
| -------- | ------ | -------- | -------------------------------- | ------ | ---------------- |
| 字符 | `char` | 2 字节 | Unicode 字符(U+0000 到 U+FFFF) | '\0' | `char ch = 'A';` |
**注意**:
- 使用单引号包裹字符:`'A'`。
- 支持转义字符:`'\n'`(换行)、`'\t'`(制表符)。
---
### 布尔类型
| 类型名称 | 关键字 | 内存大小 | 取值范围 | 默认值 | 示例 |
| -------- | ------ | -------- | ----------------- | ------ | ------------------- |
| 布尔值 | `bool` | 1 字节 | `true` 或 `false` | false | `bool flag = true;` |
**注意**:
- C# 中布尔值不能隐式转换为整数(如 `0` 或 `1`)。
---
## 引用类型(Reference Types)
### 字符串类型
| 类型名称 | 关键字 | 默认值 | 示例 |
| -------- | -------- | ------ | --------------------- |
| 字符串 | `string` | `null` | `string s = "Hello";` |
**特点**:
- 不可变性:字符串一旦创建,内容不可更改。
- 支持转义字符:`"C:\\Path"` 或逐字字符串 `@"C:\Path"`。
---
### 对象类型
| 类型名称 | 关键字 | 默认值 | 示例 |
| -------- | -------- | ------ | ------------------- |
| 对象 | `object` | `null` | `object obj = 100;` |
**特点**:
- 所有类型的基类,可存储任意数据(装箱/拆箱操作)。
---
## 默认值与初始化
- **值类型**:默认值为零或等价形式(如 `0`、`false`、`'\0'`)。
- **引用类型**:默认值为 `null`。
```csharp
int num; // 默认值为 0
bool flag; // 默认值为 false
string text; // 默认值为 null
```
## 类型转换
### 隐式转换(自动)
csharp
```
int a = 100;
long b = a; // 无需显式转换
```
### 显式转换(强制)
csharp
```
double x = 3.14;
int y = (int)x; // 结果为 3(丢失精度)
```
### 方法转换
csharp
```
string s = "123";
int num = int.Parse(s); // 字符串转整数
```
------
## 注意事项
1. **整数溢出**:使用 `checked` 关键字检测溢出。
csharp
```
checked {
int max = int.MaxValue;
max++; // 抛出 OverflowException
}
```
2. **浮点精度问题**:避免直接比较浮点数。
csharp
```
double a = 0.1 + 0.2;
bool equal = (a == 0.3); // 可能返回 false
```
3. **字符串操作**:频繁修改字符串时使用 `StringBuilder`。
------
## 总结
| 特性 | 值类型 | 引用类型 |
| :------- | :------------------------------ | :----------------------- |
| 存储位置 | 栈 | 堆 |
| 赋值行为 | 复制实际值 | 复制引用地址 |
| 性能 | 高效(无垃圾回收开销) | 需要垃圾回收 |
| 典型类型 | `int`, `double`, `bool`, `char` | `string`, `object`, 数组 |