字符串 #

一、字符串概述 #

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