C# 字符串(String)详解与常用操作示例

在 C# 中:

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

stringSystem.String 的别名:

csharp 复制代码
System.String s = "Hello";

核心特性

  • string 是引用类型

  • string 是 sealed 密封类

  • 底层存储为 char[]

  • 实现了:

    • IComparable
    • IEnumerable<char>
    • IEquatable<string>

二、字符串创建方式

1️⃣ 直接赋值(最常用)

csharp 复制代码
string name = "Jack";

2️⃣ 使用构造函数

csharp 复制代码
char[] chars = { 'H', 'e', 'l', 'l', 'o' };
string str = new string(chars);

3️⃣ 字符串拼接

csharp 复制代码
string fullName = firstName + " " + lastName;

4️⃣ string.Join

csharp 复制代码
string[] arr = { "A", "B", "C" };
string result = string.Join("-", arr);

5️⃣ 字符串插值(推荐)

csharp 复制代码
string name = "Tom";
int age = 20;

string msg = $"Name: {name}, Age: {age}";

三、字符串不可变(核心理解)

csharp 复制代码
string s = "Hello";
s += " World";

看似修改字符串,实际发生:

  1. 创建新字符串 "Hello World"
  2. 原字符串保持不变
  3. 原对象等待 GC 回收

为什么设计为不可变?

  1. 线程安全
  2. 支持字符串常量池
  3. 哈希值稳定(可作为 Dictionary key)
  4. 提高 CLR 优化能力

四、字符串驻留机制(Intern 机制)

csharp 复制代码
string s1 = "abc";
string s2 = "abc";

可能指向同一块内存。

因为:

  • CLR 维护字符串常量池
  • 相同字面量只存储一份

验证:

csharp 复制代码
Console.WriteLine(object.ReferenceEquals(s1, s2));

五、字符串拼接性能对比

❌ 不推荐:循环中使用 +

csharp 复制代码
string result = "";
for(int i = 0; i < 10000; i++)
{
    result += i;
}

问题:

  • 每次拼接都会创建新对象
  • 产生大量 GC

✅ 推荐:StringBuilder

csharp 复制代码
using System.Text;

StringBuilder sb = new StringBuilder();

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

string result = sb.ToString();

特点:

  • 可变字符串
  • 性能高
  • 减少内存分配

使用建议

场景 推荐方式
少量拼接 + 或 $
多参数格式化 字符串插值
数组拼接 string.Join
循环拼接 StringBuilder

六、字符串常用属性

csharp 复制代码
string text = "Hello";
成员 说明
Length 获取长度
text[index] 获取指定位置字符

示例:

csharp 复制代码
Console.WriteLine(text.Length); // 5
Console.WriteLine(text[1]);     // e

七、常用字符串方法

1️⃣ 比较字符串(推荐写法)

❌ 不推荐:

csharp 复制代码
s1.ToLower() == s2.ToLower();

会创建新字符串。

✅ 推荐:

csharp 复制代码
string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase);

常见枚举值:

枚举 说明
Ordinal 按字节比较
OrdinalIgnoreCase 忽略大小写
CurrentCulture 按当前文化比较

2️⃣ 判断是否包含

csharp 复制代码
str.Contains("abc");
str.StartsWith("abc");
str.EndsWith("abc");

3️⃣ 查找位置

csharp 复制代码
str.IndexOf("abc");

4️⃣ 截取

csharp 复制代码
str.Substring(startIndex, length);

5️⃣ 替换

csharp 复制代码
str.Replace("old", "new");

6️⃣ 分割

csharp 复制代码
string[] parts = str.Split(',');

7️⃣ 去除空格

csharp 复制代码
str.Trim();
str.TrimStart();
str.TrimEnd();

八、字符串判空(高频重点)

csharp 复制代码
string.IsNullOrEmpty(str);
string.IsNullOrWhiteSpace(str);

区别:

方法 判断内容
IsNullOrEmpty null 或 ""
IsNullOrWhiteSpace null、""、空格

推荐优先使用 IsNullOrWhiteSpace


九、字符串格式化

1️⃣ string.Format

csharp 复制代码
string result = string.Format("Name:{0}, Age:{1}", name, age);

2️⃣ ToString 格式化

csharp 复制代码
DateTime dt = DateTime.Now;
string result = dt.ToString("yyyy-MM-dd HH:mm:ss");

3️⃣ 字符串插值(推荐)

csharp 复制代码
string result = $"{dt:yyyy-MM-dd HH:mm:ss}";

十、DateTime 常见格式

csharp 复制代码
DateTime dt = new DateTime(2024, 12, 25, 18, 45, 30, 256);

csharp 复制代码
dt.ToString("yyyy"); // 2024
dt.ToString("yy");   // 24

csharp 复制代码
dt.ToString("MM");   // 12
dt.ToString("MMMM"); // 十二月

csharp 复制代码
dt.ToString("dd");   // 25
dt.ToString("dddd"); // 星期三

时间

csharp 复制代码
dt.ToString("HH");   // 18
dt.ToString("mm");   // 45
dt.ToString("ss");   // 30
dt.ToString("fff");  // 256

十一、生产环境注意文化问题

csharp 复制代码
using System.Globalization;

dt.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);

原因:

  • 不同服务器地区文化不同
  • 保证格式统一
  • 避免线上问题

十二、== 与 Equals

对于 string:

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

Console.WriteLine(a == b);       // True
Console.WriteLine(a.Equals(b));  // True

string 重写了 ==,比较的是值,不是地址。


十三、常见面试总结点

  • string 是引用类型
  • string 是不可变类型
  • 存在字符串常量池
  • 频繁拼接使用 StringBuilder
  • 比较字符串推荐使用 StringComparison
  • 判空使用 IsNullOrEmpty / IsNullOrWhiteSpace
  • 生产环境注意文化问题
  • string 重写了 == 运算符

最终整体理解

掌握字符串不仅是会用 API,而是理解:

  • 内存模型
  • 不可变设计思想
  • 性能差异
  • 文化差异
  • 实际生产环境写法

当你能够解释"为什么要这样写",而不仅仅是"怎么写",说明你已经真正掌握了 C# 字符串。

相关推荐
游乐码2 小时前
c#运算符重载
开发语言·c#
游乐码2 小时前
c#继承的原则
开发语言·c#
游乐码2 小时前
c#内部类和分部类
开发语言·c#
qq_454245035 小时前
GraphMindStudio 数据操作层解析:基于 SQLite 的封装与自动化存储
sqlite·c#
HY小海6 小时前
【Unity游戏创作】常见的设计模式
unity·设计模式·c#·游戏程序
专注VB编程开发20年6 小时前
C#,VB.NET如何用GPU进行大量计算,提高效率?
开发语言·c#·.net
qq_454245037 小时前
开源GraphMindStudio工作流引擎:自动化与AI智能体的理想核心
运维·人工智能·开源·c#·自动化
(initial)21 小时前
B-02. Shared Memory 深度优化:从 Bank Conflict 到 Tensor Core Swizzling
开发语言·c#
fdc20171 天前
解耦的艺术:用责任链模式构建可插拔的文件处理流水线
c#·.net·责任链模式