C# 提供 16 种内置预定义类型,分为13 种简单类型、3 种非简单类型。 所有预定义类型名称均为全小写。
graph TD
A[Predefined Types] --> B[Simple]
A --> C[object]
A --> D[string]
A --> E[dynamic]
B --> F[Non-numeric]
B --> G[Numeric]
F --> H[bool]
F --> I[char]
G --> J[Integer]
G --> K[Floating Point]
J --> L[8-Bit]
J --> M[16-Bit]
J --> N[32-Bit]
J --> O[64-Bit]
L --> P[sbyte]
L --> Q[byte]
M --> R[short]
M --> S[ushort]
N --> T[int]
N --> U[uint]
O --> V[long]
O --> W[ulong]
K --> X[decimal]
K --> Y[float]
K --> Z[double]
%% 设置叶子节点为绿色
style H fill:#90ee90
style I fill:#90ee90
style P fill:#90ee90
style Q fill:#90ee90
style R fill:#90ee90
style S fill:#90ee90
style T fill:#90ee90
style U fill:#90ee90
style V fill:#90ee90
style W fill:#90ee90
style X fill:#90ee90
style Y fill:#90ee90
style Z fill:#90ee90
style C fill:#90ee90
style D fill:#90ee90
style E fill:#90ee90
13 种简单类型
- 数值 (11) 整数 8 种:
sbyte/byte、short/ushort、int/uint、long/ulong小数 3 种:float、double、decimal(decimal 专用于金额高精度计算) - 非数值 (2):
char(Unicode 字符)、bool(仅 true/false)
特性:C# 数值不能直接当作布尔判断,区别于 C/C++。
3 种非简单引用类型
string(字符序列)、object(所有类型基类)、dynamic(动态语言互操作)
C#类型和.NET类型
所有预定义类型都会直接映射到底层 .NET 类型。C# 的类型名称只是对应 .NET 类型的别名,因此语法上直接使用 .NET 原生类型名也能正常编译,但官方不推荐这种写法。在 C# 代码中,应当优先使用 C# 内置关键字别名,而非 .NET 完整类名。
预定义简单类型
| C# 关键字 | 含义 | 取值范围 | .NET 底层类型 | 默认值 |
|---|---|---|---|---|
| sbyte | 8 位有符号整数 | -128 ~ 127 | System.SByte | 0 |
| byte | 8 位无符号整数 | 0 ~ 255 | System.Byte | 0 |
| short | 16 位有符号整数 | -32768 ~ 32767 | System.Int16 | 0 |
| ushort | 16 位无符号整数 | 0 ~ 65535 | System.UInt16 | 0 |
| int | 32 位有符号整数 | -2147483648 ~ 2147483647 | System.Int32 | 0 |
| uint | 32 位无符号整数 | 0 ~ 4294967295 | System.UInt32 | 0 |
| long | 64 位有符号整数 | -9223372036854775808 ~ 9223372036854775807 | System.Int64 | 0 |
| ulong | 64 位无符号整数 | 0 ~ 18446744073709551615 | System.UInt64 | 0 |
| float | 单精度浮点数 | 1.5×10⁻⁴⁵ ~ 3.4×10³⁸ | System.Single | 0.0f |
| double | 双精度浮点数 | 5×10⁻³²⁴ ~ 1.7×10³⁰⁸ | System.Double | 0.0d |
| bool | 布尔类型 | true / false | System.Boolean | false |
| char | Unicode 字符 | U+0000 ~ U+FFFF | System.Char | \x0000(空字符) |
| decimal | 高精度十进制数值(28 位有效数字) | ±1.0×10⁻²⁸ ~ ±7.9×10²⁸ | System.Decimal | 0m |
预定义非简单类型
| C# 关键字 | 含义 | .NET 底层类型 |
|---|---|---|
| object | 所有类型(包含简单值类型)的基类 | System.Object |
| string | 由 0 个或多个 Unicode 字符组成的字符串 | System.String |
| dynamic | 适配动态语言程序集的动态类型 | 无对应的固定.NET 类型 |
int = System.Int32、string = System.String 本质完全等价,编译器会自动互换识别;
编码规范强制推荐使用 C# 关键字(int 而非 Int32),代码可读性更高。
简单类型 也叫值类型 Value Type
存储单一数值,分配在栈内存;
声明后未手动赋值时,会自动赋予表格内标注的默认值;
全部直接继承自 object,支持装箱 / 拆箱操作。(后面会提到)
整数系列
- 带
u前缀(uint/ushort/ulong/byte):无符号,仅存储非负数; - sbyte/short/int/long:有符号,可存储正负整数。
浮点系列
float:单精度,后缀f,精度低、运算快,适用于图形、3D 计算;double:双精度,后缀d,默认浮点字面量类型,通用科学计算;decimal:高精度十进制,后缀m,专为金融、货币场景设计,无浮点精度丢失问题。
布尔类型和字符类型
bool:仅两个取值,不能和数字互相隐式转换;char:存储单个 Unicode 字符,本质是 16 位无符号数字。
非简单类型(引用类型 Reference Type)
- object:万物基类,所有值类型、引用类型都派生自它,是装箱机制的核心;
- string:特殊引用类型,字符串不可变,
""空字符串为合法默认实例; - dynamic:编译期不做类型校验,运行时解析成员,无固定.NET 映射,多用于和 Python/Ruby 等动态语言交互,牺牲编译安全换取灵活性。
static void Main(string[] args)
{
// 1. 8位整数
sbyte sByteNum = -60;
byte byteNum = 200;
// 2. 16位整数
short shortNum = -12000;
ushort uShortNum = 50000;
// 3. 32位整数
int intNum = -888888;
uint uIntNum = 3000000000U;
// 4. 64位整数
long longNum = -7000000000000L;
ulong uLongNum = 12000000000000000UL;
// 5. 浮点类型
float floatNum = 3.14f;
double doubleNum = 2.71828;
decimal decMoney = 999.99m;
// 6. 布尔类型
bool flag = true;
// 7. Unicode字符
char ch = 'A';
// 8. 非简单预定义类型
object obj = 123;
string str = "FOXDEVELOP.COM";
dynamic dy = "jack";
}Code language: C# (cs)