C# 字符串(String)详解

**摘要:**本文系统讲解C#字符串的核心特性与操作方法。字符串是System.String类的对象,具有不可变性(Immutable)特点,任何修改都会创建新对象。文章详细介绍了字符串的三种创建方式、长度获取、字符访问以及四种拼接方法(推荐字符串插值)。同时涵盖了字符串比较、常用方法(Contains、IndexOf、Substring、Replace等)、类型转换、遍历方式、空值判断以及性能优化技巧(StringBuilder)。最后介绍了转义字符、逐字字符串和C# 11+的原始字符串特性,为C#开发者提供完整的字符串操作指南。

在 C# 中,字符串(String) 是最常用的数据类型之一,用于存储文本数据。字符串实际上是 System.String 类的对象,因此可以使用大量内置方法进行操作。

cs 复制代码
string name = "Hello";
String name2 = "World";   // String 和 string 完全等价

说明:

  • stringSystem.String 的别名(推荐使用)
  • String 是 .NET 类名

一、字符串的特点

1、字符串是引用类型

cs 复制代码
string s = "abc";

虽然是引用类型,但它的使用方式和普通变量非常相似。


2、字符串不可修改(Immutable)

这是 C# String 最重要的特点。

例如:

cs 复制代码
string s = "Hello";

s += " World";

Console.WriteLine(s);

输出:

复制代码
Hello World

实际上发生的是:

cs 复制代码
原字符串
Hello

↓

创建新字符串
Hello World

↓

变量 s 指向新字符串

原来的 "Hello" 并没有修改。

因此:

复制代码
String 永远不会修改自己
只会创建新的字符串

二、字符串创建方式

方法1:直接赋值(最常用)

cs 复制代码
string str = "Hello";

方法2:new

cs 复制代码
string str = new string('A', 5);

Console.WriteLine(str);

输出:

复制代码
AAAAA

方法3:字符数组

cs 复制代码
char[] chars =
{
    'H',
    'e',
    'l',
    'l',
    'o'
};

string str = new string(chars);

Console.WriteLine(str);

输出:

复制代码
Hello

三、字符串长度

使用:

复制代码
Length

例如:

cs 复制代码
string str = "Hello";

Console.WriteLine(str.Length);

输出:

复制代码
5

四、访问字符串字符

字符串可以像数组一样访问。

cs 复制代码
string str = "Hello";

Console.WriteLine(str[0]);
Console.WriteLine(str[1]);
Console.WriteLine(str[4]);

输出:

复制代码
H
e
o

注意:

不能修改

复制代码
str[0] = 'A';

错误:

复制代码
字符串不可修改

五、字符串拼接

方法1:+

cs 复制代码
string first = "Hello";
string second = "World";

string result = first + " " + second;

Console.WriteLine(result);

输出:

复制代码
Hello World

方法2:+=

cs 复制代码
string s = "Hello";

s += " C#";

结果:

复制代码
Hello C#

方法3:String.Concat

cs 复制代码
string str = String.Concat("A", "B", "C");

Console.WriteLine(str);

输出:

复制代码
ABC

方法4:字符串插值(推荐)

cs 复制代码
string name = "Tom";
int age = 18;

string info = $"姓名:{name} 年龄:{age}";

输出:

复制代码
姓名:Tom 年龄:18

这是现代 C# 最推荐的方式。


六、字符串格式化

旧方法:

cs 复制代码
string str = String.Format(
    "姓名:{0} 年龄:{1}",
    "Tom",
    18);

输出:

复制代码
姓名:Tom 年龄:18

现在更推荐

复制代码
$"姓名:{name} 年龄:{age}"

七、字符串比较

==

cs 复制代码
string a = "abc";
string b = "abc";

Console.WriteLine(a == b);

输出:

复制代码
True

比较的是内容,而不是地址。


Equals()

复制代码
Console.WriteLine(a.Equals(b));

输出:

复制代码
True

Compare()

cs 复制代码
Console.WriteLine(
    String.Compare("abc", "abd")
);

返回:

复制代码
<0

说明:

复制代码
abc < abd

返回值:

复制代码
0    相等
<0   前面小
>0   前面大

八、常用字符串方法

1、Contains()

是否包含

cs 复制代码
string str = "Hello World";

Console.WriteLine(
    str.Contains("World")
);

输出:

复制代码
True

2、StartsWith()

复制代码
str.StartsWith("He");

结果:

复制代码
True

3、EndsWith()

复制代码
str.EndsWith("ld");

结果:

复制代码
True

4、IndexOf()

查找位置

复制代码
Console.WriteLine(
    str.IndexOf("World")
);

输出:

复制代码
6

没有找到:

复制代码
-1

5、LastIndexOf()

从后找

复制代码
str.LastIndexOf("o");

6、Substring()

截取字符串

cs 复制代码
string str = "Hello World";

Console.WriteLine(
    str.Substring(6)
);

输出:

复制代码
World

指定长度:

复制代码
str.Substring(6, 3);

输出:

复制代码
Wor

7、Replace()

替换

cs 复制代码
string str = "I like Java";

str = str.Replace(
    "Java",
    "C#"
);

Console.WriteLine(str);

输出:

复制代码
I like C#

8、ToUpper()

复制代码
Console.WriteLine(
    "abc".ToUpper()
);

输出:

复制代码
ABC

9、ToLower()

复制代码
Console.WriteLine(
    "ABC".ToLower()
);

输出:

复制代码
abc

10、Trim()

去掉两边空格

cs 复制代码
string str = "   Hello   ";

Console.WriteLine(
    str.Trim()
);

输出:

复制代码
Hello

还有:

复制代码
TrimStart()

TrimEnd()

11、Split()

拆分字符串

cs 复制代码
string str = "苹果,香蕉,西瓜";

string[] arr = str.Split(',');

foreach (string s in arr)
{
    Console.WriteLine(s);
}

输出:

复制代码
苹果
香蕉
西瓜

12、Join()

拼接数组

复制代码
string[] arr =
{
    "A",
    "B",
    "C"
};

Console.WriteLine(
    String.Join("-", arr)
);

输出:

复制代码
A-B-C

九、字符串转数字

cs 复制代码
string str = "123";

int num = int.Parse(str);

Console.WriteLine(num + 1);

输出:

复制代码
124

使用 TryParse 更安全:

cs 复制代码
string str = "123";

if (int.TryParse(str, out int num))
{
    Console.WriteLine(num);
}
else
{
    Console.WriteLine("转换失败");
}

十、数字转字符串

cs 复制代码
int num = 100;

string s = num.ToString();

或者:

复制代码
Convert.ToString(num);

十一、逐字符遍历字符串

1.for

cs 复制代码
string str = "Hello";

for (int i = 0; i < str.Length; i++)
{
    Console.WriteLine(str[i]);
}

2.foreach

cs 复制代码
foreach (char c in "Hello")
{
    Console.WriteLine(c);
}

十二、空字符串与 null

cs 复制代码
string s1 = "";
string s2 = null;

区别:

复制代码
""      长度为0
null    没有对象

推荐判断:

复制代码
String.IsNullOrEmpty(s);

或者:

复制代码
String.IsNullOrWhiteSpace(s);

示例:

cs 复制代码
string s = "   ";

Console.WriteLine(
    String.IsNullOrWhiteSpace(s)
);

输出:

复制代码
True

十三、字符串性能优化------StringBuilder

如果需要频繁拼接字符串(如循环中),推荐使用 StringBuilder。

cs 复制代码
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)
{
    sb.Append(i);
}

string result = sb.ToString();

原因:

  • string 每次拼接都会创建新的字符串对象。
  • StringBuilder 在内部维护可扩展缓冲区,减少对象创建,性能更高。

十四、转义字符

复制代码
string s = "Hello\nWorld";

输出:

复制代码
Hello
World

常见转义字符:

转义字符 含义
\n 换行
\r 回车
\t 制表符
\\ 反斜杠
\" 双引号
\' 单引号

十五、逐字字符串(Verbatim String)

使用 @ 可以避免大量转义。

cs 复制代码
string path = @"C:\Users\Admin\Desktop";

Console.WriteLine(path);

输出:

复制代码
C:\Users\Admin\Desktop

多行字符串:

复制代码
string text = @"第一行
第二行
第三行";

十六、原始字符串(Raw String,C# 11+)

C# 11 引入了三引号原始字符串,特别适合编写 JSON、SQL、HTML 等内容。

cs 复制代码
string json = """
{
  "name": "Tom",
  "age": 18
}
""";

Console.WriteLine(json);

特点:

  • 无需转义双引号。
  • 保留换行和缩进。
  • 非常适合嵌入大段文本。

十七、总结

功能 常用方法/属性
获取长度 Length
获取字符 str[index]
拼接 ++=$""String.Concat()
比较 ==Equals()String.Compare()
查找 Contains()IndexOf()LastIndexOf()
截取 Substring()
替换 Replace()
大小写转换 ToUpper()ToLower()
去空格 Trim()TrimStart()TrimEnd()
分割 Split()
合并 String.Join()
判断空值 String.IsNullOrEmpty()String.IsNullOrWhiteSpace()
数字转换 Parse()TryParse()ToString()
高性能拼接 StringBuilder
特殊字符串 @""$""""" """(Raw String)
相关推荐
站大爷IP6 分钟前
列表推导式一用就爽?大数据量下它把我服务器内存榨干了,原来生成器才是yyds
后端
Slice_cy11 分钟前
Mint 自研框架设计与实现:从重复开发走向配置驱动(二)
前端·后端·架构
程序员cxuan15 分钟前
OpenAI 把 Hugging Face 打穿了,然后 GLM 5.2 当了救火队长?
人工智能·后端·程序员
醉城夜风~15 分钟前
C++模板详解:从基础到高级全面解析
java·开发语言·c++
地球驾驶员23 分钟前
NX二次开发C#-获取体的外表面
开发语言·c#
誰能久伴不乏38 分钟前
深入理解 C++ 多态:对象模型与底层机制解析
开发语言·c++·架构
Wang's Blog42 分钟前
Go-Zero项目开发30: 微服务配置中心的设计与实现
开发语言·微服务·golang·go-zero
HH‘HH1 小时前
前端应用的离线暂停更新策略:原理、实现与最佳实践
开发语言·前端·php
程序员天天困1 小时前
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
java·jvm·后端