C# 提供了丰富的内置类型------整数、浮点数、布尔值、字符和字符串------无需额外引用即可直接使用。这篇汇总了所有常用内置类型及其字面量写法,是一份实用的速查参考。
- 数值类型 :
int、double、decimal等各自的特点和适用场景 - 文本语法:整数、浮点数、字符串的各种字面量写法
- 特殊声明 :
var、default、dynamic的使用方式
一、数值类型
C# 提供了整数、浮点数和十进制数的内置数值类型,最常用的是 int、double 和 decimal。
1.1 整数类型
| 类型 | 范围 | 示例 | 后缀 |
|---|---|---|---|
int |
±21 亿 | int population = 67_000_000; |
无 |
long |
±9×10¹⁸ | long distance = 384_400_000L; |
L |
short |
±32767 | short temp = -40; |
无 |
byte |
0~255 | byte red = 255; |
无 |
1.2 浮点类型
| 类型 | 精度 | 示例 | 后缀 |
|---|---|---|---|
double |
64 位(默认) | double pi = 3.141592653589793; |
无(或 d) |
float |
32 位 | float gravity = 9.81f; |
f |
decimal |
128 位精确小数 | decimal price = 19.99m; |
m |
使用建议:
- 常规计算用
double - 内存受限用
float - 需要精确小数(如金额)用
decimal
1.3 无符号类型
每个有符号整数类型都有对应的无符号版本,仅存储非负值,正数范围扩大一倍。
| 有符号 → 无符号 | 典型用途 |
|---|---|
int → uint |
文件大小、计数器 |
long → ulong |
超大非负值 |
short → ushort |
网络端口号 |
1.4 本机大小的整数
nint 和 nuint 与平台指针大小匹配(32 位 / 64 位自适应),主要用于互操作和低级内存操作。日常开发中通常使用 int / long。
二、bool、char 和 string
| 类型 | 说明 | 示例 |
|---|---|---|
bool |
仅 true / false |
bool isValid = true; |
char |
单个 Unicode 字符,单引号 | char grade = 'A'; |
string |
不可变字符序列,双引号 | string greeting = "Hello, world!"; |
三、文本语法(字面量)
3.1 整数文本
csharp
int dec = 42; // 十进制
int hex = 0x2A; // 十六进制(0x 前缀)
int bin = 0b_0010_1010; // 二进制(0b 前缀)
long big = 1_000_000_000L; // 千位分隔符 _
划重点: _ 分隔符纯粹是为了可读性,编译器会忽略它,不影响数值。
3.2 浮点文本
csharp
double d = 3.14; // 默认 double
float f = 3.14f; // f 后缀 → float
decimal m = 3.14m; // m 后缀 → decimal
double scientific = 1.5e6; // 科学计数法 = 1500000
3.3 字符和字符串文本
csharp
// 转义字符
char newline = '\n';
char unicode = '\u0041'; // 'A'
// 字符串内插
string message = $"Found {dec} items";
// 逐字字符串(旧语法)
string path = @"C:\Users\docs\file.txt";
// 原始字符串字面量(C# 11+)
string json = """{"name":"Alice"}""";
// 原始 + 内插
string raw = $"""Found {dec} items in "{greeting}" """;
代码解析:
-
$"" :字符串内插,大括号内可直接写表达式。 -
@"" :逐字字符串,反斜杠不转义,适合写路径。 -
"""""" :原始字符串字面量(三个双引号),内部可以任意使用引号而无需转义,适合嵌入 JSON、XML 等内容。
四、特殊声明方式
4.1 default 表达式
生成类型的默认值:数值类型为 0,引用类型为 null。
csharp
int defaultInt = default; // 0
string defaultStr = default; // null
var limit = args.Length > 0
? int.Parse(args[0])
: default(int); // 条件表达式中的 default
4.2 var 类型推断
编译器从初始值推断类型,推断后仍是强类型,不会变成动态类型。
csharp
var count = 10; // → int
var name = "C#"; // → string
var items = new List<string>(); // → List<string>
4.3 目标类型 new
当类型可从上下文推断时,省略 new 后面的类型名称。
csharp
List<string> names = new() { "Alice", "Bob" };
Dictionary<int, string> map = new();
4.4 dynamic 类型
绕过编译时类型检查,在运行时解析操作。主要用于 COM 互操作或动态语言交互。
csharp
dynamic value = 42;
value = "Now I'm a string"; // 编译通过,运行时解析
常见坑: dynamic 会失去编译时安全保护,拼写错误的方法名只会在运行时崩溃。一般应用代码中应尽量避免使用。
五、快速决策参考
| 场景 | 推荐类型 |
|---|---|
| 计数、索引 | int |
| 大数值(超出 21 亿) | long |
| 科学计算、普通浮点 | double |
| 金额、精确计算 | decimal |
| 内存敏感、大量数组 | float |
| 状态标记 | bool |
| 单字符 | char |
| 文本 | string |
最后
C# 的内置类型体系遵循"够用不复杂"的原则------int / double / decimal / bool / string 这五个类型覆盖了 80% 以上的日常开发场景。剩下的 long、float、byte 等按需选用即可。