C#核心学习(十六)面向对象--关联知识点(2)string和Stringbuilder

引言

        在C#开发中,字符串处理是日常编码的基础需求。然而stringStringBuilder的选择常常引发困惑——何时该用不可变的string?什么场景下必须选择可变的StringBuilder?本文将深入剖析两者的核心差异,并通过完整API对比给出实用建议。


一、String类的特性与应用

1.1 不可变性的本质

string s = "Hello";
s += ", World!"; // 实际创建了新对象
Console.WriteLine(s); // 输出"Hello, World!"

每次修改都会生成新实例,原内存无法回收(需依赖GC) 

1.2 核心API方法

string 类 API 汇总

方法/属性 描述 示例
静态方法
Concat(params string[]) 连接多个字符串 string.Concat("A", "B", "C"); // "ABC"
Format(string, params object[]) 格式化字符串 string.Format("Name: {0}", "Alice"); // "Name: Alice"
Join(string, string[]) 用分隔符连接字符串数组 string.Join(",", new[]{"A", "B"}); // "A,B"
IsNullOrEmpty(string) 检查字符串是否为空或 null string.IsNullOrEmpty(""); // true
IsNullOrWhiteSpace(string) 检查是否为空、null 或仅包含空白字符 string.IsNullOrWhiteSpace(" "); // true
实例方法
Length (属性) 获取字符串长度 int len = "Hello".Length; // 5
Substring(int start, int length) 提取子字符串 "Hello".Substring(1, 3); // "ell"
Split(params char[]) 按分隔符分割字符串 "A,B,C".Split(','); // ["A", "B", "C"]
Replace(string old, string new) 替换子字符串 "abc".Replace("a", "X"); // "Xbc"
Contains(string) 判断是否包含子字符串 "Hello".Contains("ell"); // true
StartsWith(string) / EndsWith(string) 检查开头或结尾 "Hello".StartsWith("He"); // true
ToUpper() / ToLower() 转换为全大写或全小写 "Abc".ToUpper(); // "ABC"
Trim() 移除前后空白字符 " text ".Trim(); // "text"
IndexOf(char/string) 查找字符或子字符串的位置 "Hello".IndexOf('e'); // 1

这里查找字符的位置还有一个后向查找的LastIndexOf和这里用法一样 

注意这里的替换,是指将所有相同的内容全部替换。 

二、StringBuilder的进阶用法

2.1 可变性的性能优势

StringBuilder sb = new StringBuilder(100); // 预分配容量
for(int i=0;i<1000;i++){
    sb.Append($"Item {i}");
}
// 最终一次内存分配
string result = sb.ToString();

2.2 关键API详解

StringBuilder 类 API 汇总

方法/属性 描述 示例
构造方法
StringBuilder() 创建空 StringBuilder var sb = new StringBuilder();
StringBuilder(string) 用初始字符串创建 var sb = new StringBuilder("Hello");
核心方法
Append(string) 追加内容到末尾 sb.Append(" World");
AppendLine(string) 追加内容并换行 sb.AppendLine("Next Line");
Insert(int index, string) 在指定位置插入内容 sb.Insert(0, "Start: ");
Remove(int start, int len) 移除指定范围的字符 sb.Remove(0, 5);
Replace(string, string) 替换所有匹配的子字符串 sb.Replace("old", "new");
Clear() 清空内容 sb.Clear();
ToString() 转换为 string string result = sb.ToString();
属性
Length (属性) 当前内容的长度 int len = sb.Length;
Capacity (属性) 动态分配的容量(可设置) sb.Capacity = 1024;

三、什么时候用什么

        前面我们说了,string,每次拼接一个字符串,其实是会产生一个新的字符串,在多次的【拼接下,会十分的消耗性能,浪费内存,所以我们必须区分什么时候使用string,什么时候使用stringbulider优化,每一种设计出来的对象类型都会有它的作用的!

优先使用String的场景
场景特征 推荐方案 典型案例
单次赋值 string 硬编码常量
const string AppName = "MyApp"
少量拼接 string var msg = baseMsg + DateTime.Now.ToString()
LINQ查询 string Where(x => x.Name.Contains("admin"))
多线程共享 string 跨线程传递只读数据
使用StringBuilder的场景
场景特征 推荐方案 性能对比数据
循环内拼接 StringBuilder 1000次循环:string耗时1200ms vs sb8ms
不确定长度 StringBuilder 动态增长比反复分配节省70%内存
复杂格式化 StringBuilder 支持AppendFormat等高级操作
大文本处理 StringBuilder 10万字符操作性能提升20倍

关键点总结

  • string:不可变类型,每次修改都会创建新对象,适合少量修改或固定文本操作。

  • StringBuilder:可变类型,直接在内存中修改内容,适合高频字符串拼接或大规模修改(如循环中操作)。

根据需求选择:需要性能时用 StringBuilder,简单场景用 string

你可能感兴趣的:(c#,学习,面向对象,string,stringbuilder)