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

news2025/4/16 3:04:57

引言

        在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)检查字符串是否为空或 nullstring.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()创建空 StringBuildervar 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()转换为 stringstring result = sb.ToString();
属性
Length (属性)当前内容的长度int len = sb.Length;
Capacity (属性)动态分配的容量(可设置)sb.Capacity = 1024;

三、什么时候用什么

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

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

关键点总结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏引擎学习第223天

回顾 今天我们正在进行过场动画序列的制作&#xff0c;因此我想深入探讨这个部分。昨天&#xff0c;我们暂时停止了过场动画的制作&#xff0c;距离最终结局还有一些内容没有完成。今天的目标是继续完成这些内容。 我们已经制作了一个过场动画的系列&#xff0c;并把它们集中…

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)📚…

LabVIEW配电器自动测试系统

随着航天技术的迅猛发展&#xff0c;航天器供配电系统的结构越来越复杂&#xff0c;对配电器的功能完整性、稳定性和可靠性提出了更高要求。传统人工测试方式难以满足高效率、高精度、可重复的测试需求。本项目开发了一套基于LabVIEW平台的宇航配电器自动测试系统&#xff0c;融…

PhotoShop学习09

1.弯曲钢笔工具 PhotoShop提供了弯曲钢笔工具可以直观地创建路径&#xff0c;只需要对分段推拉就能够进行修改。弯曲港币工具位于工具面板中的钢笔工具里&#xff0c;它的快捷键为P。 在使用前&#xff0c;可以把填充和描边选为空颜色&#xff0c;并打开路径选项&#xff0c;勾…

【C++】哈希unordered_map和set的使用以及哈希表,哈希桶的概念以及底层实现

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 本文章完整代码在下篇文章开头给出 上篇文章&#xff1a;map和set使用红黑树封装的底层实现 下篇文章&#xff1a;封装…

设计模式——建造者模式(生成器模式)总结

当我们需要创建一个非常复杂的对象时&#xff0c;可以使用建造者模式&#xff0c;分步骤建造一个对象&#xff0c;最后将完整的对象返回给客户端。 比如&#xff0c;我们要生成一个房子对象&#xff0c;建造一个房子&#xff0c;需要打地基、盖围墙、盖地板、安装门、安装窗户…

使用Python爬虫的2大原因和6大常用库

爬虫其实就是请求http、解析网页、存储数据的过程&#xff0c;并非高深的技术&#xff0c;但凡是编程语言都能做&#xff0c;连Excel VBA都可以实现爬虫&#xff0c;但Python爬虫的使用频率最高、场景最广。 这可不仅仅是因为Python有众多爬虫和数据处理库&#xff0c;还有一个…

Java 架构设计:从单体架构到微服务的转型之路

Java 架构设计&#xff1a;从单体架构到微服务的转型之路 在现代软件开发中&#xff0c;架构设计的选择对系统的可扩展性、可维护性和性能有着深远的影响。随着业务需求的日益复杂和用户规模的不断增长&#xff0c;传统的单体架构逐渐暴露出其局限性&#xff0c;而微服务架构作…

C# 混淆代码工具--ConfuserEx功能与使用指南

目录 1 前言1.1 可能带来的问题 2 ConfuserEx2.1 简介2.2 功能特点2.3 基本使用方法2.4 集成到MSBuild2.5 深入设置2.5.1 保护机制2.5.1.1 ConfuserEx Protection 2.5.2 精细的代码保护主要特性1. decl-type(string)2.full-name(string)3. is-public()4. match(string)5. match…

使用PyTorch实现目标检测边界框转换与可视化

一、引言 在目标检测任务中&#xff0c;边界框&#xff08;Bounding Box&#xff09;的坐标表示与转换是核心基础操作。本文将演示如何&#xff1a; 实现边界框的两种表示形式&#xff08;角点坐标 vs 中心坐标&#xff09;之间的转换 使用Matplotlib在图像上可视化边界框 验…

nlp面试重点

深度学习基本原理&#xff1a;梯度下降公式&#xff0c;将损失函数越来越小&#xff0c;最终预测值和实际值误差比较小。 交叉熵&#xff1a;-p(x)logq(x)&#xff0c;p(x)是one-hot形式。如果不使用softmax计算交叉熵&#xff0c;是不行的。损失函数可能会非常大&#xff0c;…

欢乐力扣:反转链表二

文章目录 1、题目描述2、思路 1、题目描述 反转链表二。  给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 2、思路 参考官方题解&#xff0c;基本思路…

14-大模型微调和训练之-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))

1. datasets 库核心方法 1.1. 列出数据集 使用 datasets 库&#xff0c;你可以轻松列出所有 Hugging Face 平台上的数据集&#xff1a; from datasets import list_datasets # 列出所有数据集 all_datasets list_datasets() print(all_datasets)1.2. 加载数据集 你可以通过…

论文阅读笔记——Reactive Diffusion Policy

RDP 论文 通过 AR 提供实时触觉/力反馈&#xff1b;慢速扩散策略&#xff0c;用于预测低频潜在空间中的高层动作分块&#xff1b;快速非对称分词器实现闭环反馈控制。 ACT、 π 0 \pi_0 π0​ 采取了动作分块&#xff0c;在动作分块执行期间处于开环状态&#xff0c;无法及时响…

ISIS协议(动态路由协议)

ISIS基础 基本概念 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionL…

UniApp 实现兼容 H5 和小程序的拖拽排序组件

如何使用 UniApp 实现一个兼容 H5 和小程序的 九宫格拖拽排序组件&#xff0c;实现思路和关键步骤。 一、完整效果图示例 H5端 小程序端 git地址 二、实现目标 支持拖动菜单项改变顺序拖拽过程实时预览移动位置拖拽松开后自动吸附回网格兼容 H5 和小程序平台 三、功能…

【网络协议】WebSocket讲解

目录 webSocket简介 连接原理解析: 客户端API 服务端API&#xff08;java&#xff09; 实战案例 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写服务端逻辑 &#xff08;3&#xff09;注册配置类 &#xff08;4&#xff09;前端连接 WebSocket 示例…

啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!

一、啥是Spring&#xff0c;为啥选择它 我们平常说的Spring指的是Spring全家桶&#xff0c;我们为什么要选择Spring&#xff0c;看看官方的话&#xff1a; 意思就是&#xff1a;用这个东西&#xff0c;又快又好又安全&#xff0c;反正就是好处全占了&#xff0c;所以我们选择它…

一天时间,我用AI(deepseek)做了一个配色网站

前言 最近在开发颜色搭配主题的相关H5和小程序&#xff0c;想到需要补充一个web网站&#xff0c;因此有了这篇文章。 一、确定需求 向AI要答案之前&#xff0c;一定要清楚自己想要做什么。如果你没有100%了解自己的需求&#xff0c;可以先让AI帮你理清逻辑和思路&#xff0c;…

Spring - 13 ( 11000 字 Spring 入门级教程 )

一&#xff1a; Spring AOP 备注&#xff1a;之前学习 Spring 学到 AOP 就去梳理之前学习的知识点了&#xff0c;后面因为各种原因导致 Spring AOP 的博客一直搁置。。。。。。下面开始正式的讲解。 学习完 Spring 的统一功能后&#xff0c;我们就进入了 Spring AOP 的学习。…