🐸 青蛙编程网
首页 / C# / C# 基础 / 6. 字符串

字符串与常用操作

这是什么: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,拼接不如 $ 插值。

动手改

  1. 用 IndexOf 和 Substring 从 "frog-blog@example.com" 里切出 @ 之前的用户名
  2. 把 "a-b-c-d" 用 Split('-') 拆开,再用 Join("*") 缝回去
  3. 只调用 s.ToUpper() 不接返回值,输出 s 看看它变了吗?
  4. 把 "hello WORLD" 转成全小写再输出

下一章:.NET 常用类库,官方轮子包开箱 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。