字符串 #
一、字符串概述 #
1.1 什么是字符串 #
字符串是由零个或多个字符组成的只读序列。在C#中,string是System.String的别名。
csharp
string greeting = "Hello, World!";
String name = "张三";
1.2 字符串特性 #
- 不可变性:字符串创建后不能修改
- 引用类型:存储在堆上
- Unicode:支持多语言字符
csharp
string s1 = "Hello";
string s2 = s1;
s2 = "World";
二、字符串创建 #
2.1 字面量创建 #
csharp
string name = "张三";
string empty = "";
string space = " ";
2.2 构造函数创建 #
csharp
string s1 = new string('A', 5);
string s2 = new string(new char[] { 'H', 'e', 'l', 'l', 'o' });
2.3 特殊字符串 #
逐字字符串
csharp
string path = @"C:\Users\Documents\file.txt";
string json = @"{""name"": ""张三"", ""age"": 25}";
string multiline = @"
第一行
第二行
第三行
";
原始字符串(C# 11+)
csharp
string json = """
{
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
}
""";
string regex = """\d{3}-\d{4}""";
2.4 空字符串与null #
csharp
string empty = "";
string empty2 = string.Empty;
string nullStr = null;
bool isEmpty = string.IsNullOrEmpty(empty);
bool isNullOrWhiteSpace = string.IsNullOrWhiteSpace(" ");
三、字符串格式化 #
3.1 字符串插值 #
csharp
string name = "张三";
int age = 25;
string message = $"姓名:{name},年龄:{age}";
string expression = $"明年{age + 1}岁";
3.2 格式说明符 #
csharp
double price = 1234.5678;
Console.WriteLine($"价格:{price:F2}");
Console.WriteLine($"价格:{price:C}");
Console.WriteLine($"价格:{price:N2}");
Console.WriteLine($"百分比:{0.1234:P2}");
Console.WriteLine($"科学计数:{1234567:E2}");
常用格式说明符:
| 说明符 | 说明 | 示例 |
|---|---|---|
| C/c | 货币 | ¥1,234.57 |
| D/d | 十进制整数 | 1234 |
| E/e | 科学计数法 | 1.23E+003 |
| F/f | 固定小数点 | 1234.57 |
| G/g | 常规格式 | 1234.5678 |
| N/n | 数字 | 1,234.57 |
| P/p | 百分比 | 12.34% |
| X/x | 十六进制 | 4D2 |
3.3 日期格式化 #
csharp
DateTime now = DateTime.Now;
Console.WriteLine($"{now:yyyy-MM-dd}");
Console.WriteLine($"{now:yyyy年MM月dd日}");
Console.WriteLine($"{now:HH:mm:ss}");
Console.WriteLine($"{now:yyyy-MM-dd HH:mm:ss}");
3.4 自定义格式 #
csharp
int number = 42;
Console.WriteLine($"{number:000}");
Console.WriteLine($"{number:D5}");
double value = 1234.5;
Console.WriteLine($"{value:##,##0.00}");
3.5 复合格式化 #
csharp
string name = "张三";
int age = 25;
string message1 = string.Format("姓名:{0},年龄:{1}", name, age);
string message2 = string.Format("姓名:{0},年龄:{1},{0}今年{1}岁", name, age);
四、字符串操作 #
4.1 获取长度 #
csharp
string text = "Hello, World!";
int length = text.Length;
4.2 访问字符 #
csharp
string text = "Hello";
char first = text[0];
char last = text[text.Length - 1];
foreach (char c in text)
{
Console.WriteLine(c);
}
4.3 子字符串 #
csharp
string text = "Hello, World!";
string sub1 = text.Substring(0, 5);
string sub2 = text.Substring(7);
4.4 查找 #
csharp
string text = "Hello, World! Hello, C#!";
int index1 = text.IndexOf("Hello");
int index2 = text.IndexOf("Hello", 6);
int index3 = text.LastIndexOf("Hello");
bool contains = text.Contains("World");
bool startsWith = text.StartsWith("Hello");
bool endsWith = text.EndsWith("!");
4.5 分割与连接 #
分割
csharp
string text = "apple,banana,orange";
string[] fruits = text.Split(',');
string csv = "a,b,,c";
string[] parts = csv.Split(',', StringSplitOptions.RemoveEmptyEntries);
string multiline = "line1\nline2\nline3";
string[] lines = multiline.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
连接
csharp
string[] words = { "Hello", "World", "C#" };
string joined1 = string.Join(", ", words);
string joined2 = string.Join("-", words);
string joined3 = string.Concat(words);
4.6 大小写转换 #
csharp
string text = "Hello World";
string upper = text.ToUpper();
string lower = text.ToLower();
string title = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lower);
4.7 去除空白 #
csharp
string text = " Hello World ";
string trimmed = text.Trim();
string trimmedStart = text.TrimStart();
string trimmedEnd = text.TrimEnd();
string text2 = "***Hello***";
string trimmed2 = text2.Trim('*');
4.8 替换 #
csharp
string text = "Hello, World!";
string replaced1 = text.Replace("World", "C#");
string replaced2 = text.Replace("l", "L");
4.9 插入与删除 #
csharp
string text = "Hello World!";
string inserted = text.Insert(5, ",");
string deleted = text.Remove(5, 6);
4.10 填充 #
csharp
string text = "42";
string paddedLeft = text.PadLeft(5, '0');
string paddedRight = text.PadRight(5, '0');
五、字符串比较 #
5.1 相等比较 #
csharp
string s1 = "Hello";
string s2 = "hello";
bool equal1 = s1 == s2;
bool equal2 = s1.Equals(s2);
bool equal3 = s1.Equals(s2, StringComparison.OrdinalIgnoreCase);
5.2 大小比较 #
csharp
string s1 = "apple";
string s2 = "banana";
int result = string.Compare(s1, s2);
if (result < 0)
Console.WriteLine("s1 < s2");
else if (result > 0)
Console.WriteLine("s1 > s2");
else
Console.WriteLine("s1 == s2");
5.3 StringComparison枚举 #
| 值 | 说明 |
|---|---|
| Ordinal | 逐字节比较 |
| OrdinalIgnoreCase | 忽略大小写 |
| CurrentCulture | 使用当前区域设置 |
| CurrentCultureIgnoreCase | 忽略大小写,使用当前区域 |
| InvariantCulture | 使用固定区域 |
| InvariantCultureIgnoreCase | 忽略大小写,使用固定区域 |
csharp
bool equal = string.Equals("Hello", "hello", StringComparison.OrdinalIgnoreCase);
六、StringBuilder #
6.1 为什么使用StringBuilder #
字符串不可变,频繁拼接会产生大量临时对象:
csharp
string result = "";
for (int i = 0; i < 10000; i++)
{
result += i;
}
StringBuilder提供高效的字符串构建:
csharp
var sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
sb.Append(i);
}
string result = sb.ToString();
6.2 StringBuilder创建 #
csharp
var sb1 = new StringBuilder();
var sb2 = new StringBuilder(100);
var sb3 = new StringBuilder("Hello");
var sb4 = new StringBuilder("Hello", 100);
6.3 常用方法 #
csharp
var sb = new StringBuilder();
sb.Append("Hello");
sb.Append(", ");
sb.Append("World");
sb.AppendLine("!");
sb.AppendLine("第二行");
sb.Insert(5, " C#");
sb.Remove(0, 5);
sb.Replace("World", "C#");
string result = sb.ToString();
6.4 格式化追加 #
csharp
var sb = new StringBuilder();
sb.AppendFormat("姓名:{0},年龄:{1}", "张三", 25);
sb.AppendLine();
sb.AppendLine($"日期:{DateTime.Now:yyyy-MM-dd}");
6.5 链式调用 #
csharp
string result = new StringBuilder()
.Append("Hello")
.Append(", ")
.Append("World")
.AppendLine("!")
.ToString();
七、字符串与字符数组 #
7.1 字符串转字符数组 #
csharp
string text = "Hello";
char[] chars = text.ToCharArray();
7.2 字符数组转字符串 #
csharp
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string text = new string(chars);
7.3 修改字符数组 #
csharp
string text = "Hello";
char[] chars = text.ToCharArray();
chars[0] = 'h';
string newText = new string(chars);
八、正则表达式 #
8.1 基本使用 #
csharp
using System.Text.RegularExpressions;
string text = "我的电话是13812345678,邮箱是test@example.com";
string phonePattern = @"\d{11}";
Match phoneMatch = Regex.Match(text, phonePattern);
string emailPattern = @"[\w.-]+@[\w.-]+\.\w+";
Match emailMatch = Regex.Match(text, emailPattern);
8.2 常用方法 #
csharp
string text = "apple1 banana2 orange3";
MatchCollection matches = Regex.Matches(text, @"\d+");
bool isMatch = Regex.IsMatch(text, @"\d+");
string replaced = Regex.Replace(text, @"\d+", "#");
string[] parts = Regex.Split(text, @"\d+");
8.3 常用正则模式 #
csharp
string email = @"^[\w.-]+@[\w.-]+\.\w+$";
string phone = @"^1[3-9]\d{9}$";
string url = @"^https?://[\w.-]+(/\S*)?$";
string ip = @"^(\d{1,3}\.){3}\d{1,3}$";
九、字符串最佳实践 #
9.1 使用字符串插值 #
csharp
string name = "张三";
int age = 25;
string message = $"姓名:{name},年龄:{age}";
9.2 使用StringBuilder拼接 #
csharp
var sb = new StringBuilder();
foreach (var item in items)
{
sb.AppendLine($"- {item}");
}
9.3 正确比较字符串 #
csharp
if (string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase))
{
}
if (string.IsNullOrEmpty(input))
{
}
if (string.IsNullOrWhiteSpace(input))
{
}
9.4 使用原始字符串处理JSON #
csharp
string json = """
{
"name": "张三",
"age": 25
}
""";
十、总结 #
字符串操作要点:
| 操作 | 方法 |
|---|---|
| 格式化 | $字符串插值 |
| 查找 | IndexOf, Contains |
| 分割 | Split |
| 连接 | Join |
| 替换 | Replace |
| 去空白 | Trim |
| 大小写 | ToUpper, ToLower |
| 高效拼接 | StringBuilder |
下一步,让我们学习运算符!
最后更新:2026-03-26