字符串与常用操作
这是什么:string(字符串)——专门装文字的类型,把名字、消息、文件路径这些内容整包收好。
为什么用:程序里最常见的不是数字,是文字,可上一章的数组一个里头只装得下同一种类型,数字和文字混编时你就得来回转换、处处小心。
如何用:本章把 string 的常用操作一次集齐,好消息是它们全是现成的——都挂在 string 类型上,会点号就全解锁。
常用操作速览
string s = "Hello, Frog";
Console.WriteLine(s.Length);
Console.WriteLine(s.Substring(7));
Console.WriteLine(s.IndexOf("Frog"));
Console.WriteLine(s.Replace("Frog", "World"));
11
Frog
7
Hello, World
| 操作 | 写法 | 说明 |
|---|---|---|
| 长度 | s.Length |
空格和标点也算 |
| 截取 | s.Substring(7) |
下标从 0 数起,7 号正好是 F |
| 查找 | s.IndexOf("Frog") |
返回起始下标;没找到返回 -1 |
| 替换 | s.Replace(a, b) |
把所有 a 换成 b |
切分与拼接:Split / Join
Split 把一句话按分隔符拆成数组,Join 把数组缝回一句话:
string csv = "苹果,香蕉,橘子";
string[] fruits = csv.Split(',');
string joined = string.Join(" | ", fruits);
Console.WriteLine(joined);
苹果 | 香蕉 | 橘子
处理 CSV 数据、文件路径、空格分隔的输入,这对搭档是标配。注意
Join是string.Join——挂在 string 类型上,不用具体字符串去点它。
重点:string 是不可变的
字符串一旦创建就改不了。所有"修改"其实都产出了一个新字符串:
string s = "Hello, Frog";
s.Replace("Frog", "World"); // ❌ 白做!结果没人接住
string t = s.Replace("Frog", "World"); // ✅ 用变量接住新字符串
Console.WriteLine(t);
Hello, World
记住:Replace、ToUpper 这类方法必须有变量接住返回值,不然等于没做,s 本尊纹丝不动。这和 Python 的字符串如出一辙:改动都是改出新的。
两个字符串怎么比
比内容直接用 ==,结果是个 bool:
string a = "frog";
string b = "FROG".ToLower();
Console.WriteLine(a == b);
True
顺带认识了大小写转换:ToUpper() 全大写、ToLower() 全小写,搜索时想忽略大小写就靠它们。
插值 vs 拼接
string name = "青蛙";
string a = "你好," + name + "!"; // + 号拼接
string b = $"你好,{name}!"; // 插值
结果一样,但变量一多,+ 拼接里的引号和加号能把人绕晕。新代码统一用插值,+ 拼接能看懂就行。
❓ 常见问题
Q1:IndexOf 找不到返回什么?
返回 -1。所以查找后要先判断:if (s.IndexOf("Frog") != -1) { ... }。
Q2:Substring 下标超出长度会怎样?
会抛出 ArgumentOutOfRangeException。确保起始下标和长度都在范围内。
Q3:Replace 只替换第一个还是全部?
替换全部匹配项。只想替换第一个,需要配合 IndexOf 和 Substring 手动拼接。
⚠️ 新手翻车现场
翻车一:Replace 后原字符串没变
string s = "Hello, Frog";
s.Replace("Frog", "World"); // ❌ 白做
Console.WriteLine(s); // 还是 Hello, Frog
问题:string 不可变,Replace 返回新字符串,必须用变量接住。
修正:string t = s.Replace("Frog", "World"); Console.WriteLine(t);
翻车二:Substring 下标写错了
string s = "Hi";
s.Substring(5); // ❌ 下标 5 超出长度 2,抛异常
问题:起始下标必须小于字符串长度。
修正:先检查 s.Length,或用 IndexOf 先定位再截取。
翻车三:Split 后数组为空或少一项
string s = "a,b,";
var parts = s.Split(','); // 得到 ["a", "b", ""]
问题:尾部分隔符会产生空字符串项。
修正:用 s.Split(',', StringSplitOptions.RemoveEmptyEntries) 去掉空项。
🎯 什么时候用哪种操作
| 场景 | 推荐 | 原因 |
|---|---|---|
| 取子串 | Substring |
下标范围截取 |
| 找子串位置 | IndexOf |
返回下标,找不到 -1 |
| 批量替换 | Replace |
把所有旧值换成新值 |
| 按分隔符拆分 | Split |
CSV、路径、空格分隔都适用 |
| 数组拼回字符串 | string.Join |
指定分隔符缝合 |
| 忽略大小写比较 | ToLower()/ToUpper() |
两边统一大小写再 == |
📝 本章小结
- string 常用操作:
Length、Substring、IndexOf、Replace、Split、Join - string 不可变,修改方法必须接住返回值
- 比较内容直接用
==,忽略大小写用ToLower()/ToUpper() - 新代码优先用插值
$"",代替+拼接 Split尾部分隔符可能产生空项,StringSplitOptions.RemoveEmptyEntries可清理- 记忆口诀:字符串改不了,方法回新串;拆用 Split,缝用 Join,拼接不如 $ 插值。
动手改
- 用
IndexOf和Substring从"frog-blog@example.com"里切出 @ 之前的用户名 - 把
"a-b-c-d"用Split('-')拆开,再用Join("*")缝回去 - 只调用
s.ToUpper()不接返回值,输出s看看它变了吗? - 把
"hello WORLD"转成全小写再输出
下一章:.NET 常用类库,官方轮子包开箱 🐸