字符与布尔类型
本教程共 100 篇 · 第 11 篇 · 更新于 2026-07-31 · 约 8 分钟阅读
11. 字符与布尔类型
本节目标:掌握 char 单字符的写法、bool 的真假值,以及常见转义字符的含义,并理解它们为什么这样设计。
前面讲了数字,这章看两个”小但常用”的类型:char 和 bool。它们一个管”单个字符”,一个管”是否成立”。别看篇幅短,后面每一章几乎都要用到它们。
char:单个字符
char(字符)装一个 Unicode 字符,用单引号括起来。注意,单引号里只能放一个字符:
namespace CSharpDemo;
char grade = 'A';
char symbol = '中';
Console.WriteLine(grade);
Console.WriteLine(symbol);
'A' 是英文字母,'中' 是汉字——C# 的 char 基于 Unicode,所以中英文都能装。一个 char 占 2 字节(UTF-16 的一个代码单元)。
Note单引号
' '是char,双引号" "是string(字符串)。写错引号类型,编译直接报错。新手常把char c = "x";写错成双引号,记住:字符用单,文字用双。
为什么 char 用单引号、string 用双引号
这是 C# 从 C/C++/Java 一脉相承的约定,目的很实在:编译器一眼就能区分”你要的是单个字符”还是”一段文本”。如果两者都用双引号,写 'A' 和 "A" 就会模棱两可,类型推断也会乱套。单双引号分工,让”单字符 vs 多字符”在语法层面就分得清清楚楚,少踩很多坑。
字符也能比大小
字符在底层是对应的数字编码,所以可以比较:
char a = 'a';
char b = 'b';
Console.WriteLine(a < b); // True,因为 'a' 的编码小于 'b'
这在某些判断场景有用,比如判断一个字符是不是数字、是不是字母。不过真要判断,通常用 char.IsDigit、char.IsLetter 这类现成方法更稳妥。
编码是怎么回事
char 之所以能比大小,是因为每个字符背后都对应一个整数编号(码点)。英文常用的是 ASCII,中文等更广范围用的是 Unicode。比如 'A' 的编号是 65,'a' 是 97。比较字符其实就是比较它们的编号。理解这一点,你就明白为什么 '0' 和 0 完全不是一回事:'0' 是字符,编号 48;0 是数字零。混用它们是最常见的低级错误之一。
bool:真与假
bool(布尔)只有两个值:true(真)和 false(假)。它是所有”条件判断”的基础。
namespace CSharpDemo;
bool isOpen = true;
bool hasError = false;
Console.WriteLine(isOpen); // True
你很少直接写 true/false,更多是让表达式算出来:
int age = 20;
bool isAdult = age >= 18; // 表达式结果为 True
Console.WriteLine(isAdult);
age >= 18 这个表达式的值就是 bool。后面讲 if、循环时,全靠 bool 决定走哪条路。
TipC# 里条件判断必须是
bool,不能像某些语言用0或1代替。写if (age)会报错,必须写if (age > 0)。这条规则反而帮你少出 bug。
bool 的设计初衷
布尔类型最早由数学家乔治·布尔(George Boole)提出,用来表达”命题的真假”。程序里到处是判断:“余额够不够""文件存不存在""用户登录了没”。把这些”是否成立”统一成 true/false 两种状态,逻辑就变得干净、可组合。C# 强制要求条件必须是 bool,而不是”非零即真”,正是为了堵住”误把数值当条件”的漏洞。
转义字符
有些字符肉眼看不见(如换行、制表),或会和语法冲突(如双引号)。用反斜杠 \ 开头的转义序列(escape sequence)表示它们:
| 转义 | 含义 |
|---|---|
\n | 换行(newline) |
\t | 制表符(tab) |
\\ | 一个反斜杠本身 |
\" | 字符串里的双引号 |
\' | 字符里的单引号 |
\0 | 空字符 |
示例:
Console.WriteLine("第一行\n第二行"); // \n 换行
Console.WriteLine("姓名:\t年龄"); // \t 对齐
Console.WriteLine("他说:\"你好\""); // 输出:他说:"你好"
Console.WriteLine("路径 C:\\temp"); // 输出:路径 C:\temp
Note从 C# 13 起,新增了
\e转义,表示 ESC 控制字符(U+001B),常用于终端颜色控制。初学用不到,知道有这回事即可。
Warning转义字符前面那个
\绝对不能漏。把该写的\n写成n,编译不会报错,但输出就是普通字母n,不会换行。这种”静默出错”最难排查——运行结果不对,却找不到明显毛病。写字符串时多留意反斜杠。
字符串里的引号难题
想在字符串里放双引号,除了 \",还可以用后面要学的逐字字符串 @"..." 或原始字符串 """...""",后者在长文本里最干净。第 13 章专门讲字符串字面量。
怎么选
- 偶尔一个引号:
\"最直接。 - 整段带反斜杠的路径或正则:
@"C:\temp\a.txt"不用每个反斜杠都转义。 - 大段含引号的多行文本:原始字符串
"""..."""最清爽,连缩进都帮你处理。
三者只是写法不同,表达的字符内容一致,按场景挑顺手的即可。
char 与 string 的关系
string 可以看作一串 char。你可以用索引取出其中某个字符:
string name = "小明";
char first = name[0]; // 取出第一个字符 '小'
Console.WriteLine(first);
name[0] 里的 [0] 是”索引”,表示从第 0 个开始数。这种”按下标取字符”的能力,在字符串处理里天天用。
char 能当数字用吗
能。char 本质是 Unicode 编码值,可以隐式转成 int 看它的码点:
char c = 'A';
int code = c; // 65,'A' 的 ASCII/Unicode 码
Console.WriteLine(code);
反过来从数字得到字符,用强制转换:char ch = (char)65; 得到 'A'。这在处理密码强度、字符分类时偶尔用到,但平时更推荐 char.IsLetter 这类方法,可读性更好。
适用场景对比
| 需求 | 推荐做法 |
|---|---|
| 判断字符类别 | char.IsDigit / char.IsLetter |
| 拿到字符编号 | int code = c; 隐式转 |
| 由编号得字符 | (char)65 强制转 |
手写 c >= '0' && c <= '9' 也能用,但现成方法更不易错、更表意,首选它们。
bool 能参与算术吗
不能。C# 不允许把 bool 当 0/1 参与加减。这和某些语言不同,但恰恰是 C# 的安全设计:防止你把”条件真假”和”数值”混为一谈,写出歧义代码。
bool ok = true;
// int n = ok + 1; 错误:bool 不能转 int
要转成数字,得显式写:int flag = ok ? 1 : 0;。明确表达意图,比隐式转换更清晰。
Tip
bool只跟逻辑运算(&&、||、!)和条件判断(if、while)搭配。别试图把它塞进算式,编译器会拦你,也省了你以后踩坑。
常见疑问解答
问:一个 char 能存一个汉字吗?
能。char 基于 Unicode,一个汉字正好占一个 char。但要注意:某些表情符号(如 emoji)由多个代码单元组成,一个 char 装不下完整表情,需用 Rune 或字符串层级处理。日常中英文都没问题。
问:bool 占几个字节?
作为值类型,bool 在内存里通常占 1 字节(实际有对齐开销,但语义上是真/假)。比”它占多大”更重要的是:它只表示成立或不成立,不参与算术。
问:转义字符漏写会怎样?
比如该写 \n 却写成 n,输出就是普通字母 n,不会换行。这种错不会让编译失败,但运行结果不对,排查时记得检查字符串里的反斜杠是否漏了。
要点速记
char用单引号装单个字符,string用双引号装文本。bool只有true/false,是条件判断的基础。- 条件判断必须是
bool,不能用数字代替。 - 转义字符:
\n换行、\t制表、\\反斜杠、\"引号。
动手练一练
- 用
char存一个字母'A'和一个汉字'中',分别打印,确认char能装中文。 - 定义
int age = 20; bool isAdult = age >= 18;,打印isAdult,理解表达式产出bool。 - 写字符串
"第一行\n第二行",打印观察换行效果;再写@"C:\test\a.txt"对比转义差异。
char 与 string 的边界
char 是单个字符,string 是字符序列,两者常配合:用索引从 string 取出的是 char,把多个 char 拼起来得到 string。
string word = "码上学";
char first = word[0]; // '码'
char[] chars = word.ToCharArray(); // 拆成字符数组
string back = new string(chars); // 再拼回字符串
Console.WriteLine($"{first}, {back}");
ToCharArray 把字符串拆成 char 数组,方便逐字符处理;new string(chars) 再拼回去。这种”拆—处理—拼”的模式在文本清洗里很常见。
bool 在集合过滤里的角色
bool 常被用作”筛选条件”的返回值。比如判断一个名字是否合格:
bool IsValidName(string name) => !string.IsNullOrEmpty(name) && name.Length <= 10;
Console.WriteLine(IsValidName("小明")); // True
方法返回 bool,就能直接塞进 if 或 LINQ 的 Where 里做条件。你会越来越习惯”让方法返回 bool 表达判断”这种写法。
常见考题:判字符类别
判断一个 char 是数字、字母还是其他,别手写范围比较,用 char 类的现成方法更稳:
char c = '7';
Console.WriteLine(char.IsDigit(c)); // True,是数字
Console.WriteLine(char.IsLetter(c)); // False
char ch = 'A';
Console.WriteLine(char.IsUpper(ch)); // True,是大写字母
IsDigit、IsLetter、IsUpper、IsLower 覆盖了常见分类需求,比 c >= '0' && c <= '9' 这种手写范围更不易错,也更表意。处理用户输入、解析文本时很常用。
小结与下一步
char 用单引号装单个字符,bool 只有 true/false 管真假。转义字符让你在字符串里塞换行、引号等特殊符号。别小看这两个小类型,条件判断和文本处理都靠它们撑着。一个关键直觉:字符本质是编号,布尔本质是命题真假,理解底层,写法就不会乱。
下一章讲”类型转换”:当 string 要变 int、小数要变整数时,该怎么安全地转。