当前位置: 首页 > article >正文

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)检查字符串是否为空或 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

相关文章:

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

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

游戏引擎学习第223天

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

趣味编程之go与rust的爱恨情仇

声明:此篇文章利用deepseek生成。 第一章&#xff1a;出身之谜 Go&#xff08;江湖人称"高小戈"&#xff09;是名门之后——谷歌家的三少爷。生来就带着"简单粗暴"的家族基因&#xff0c;口号是**“少写代码多搬砖&#xff0c;并发处理赛神仙”**。它爹Ro…...

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

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

数据结构第五版【李春葆】

​ 数据结构教程上机实验指导第5版&#xff08;李春葆主编&#xff09;.pdf 数据结构教程&#xff08;第5版&#xff09;&#xff08;李春葆&#xff09;.pdf 数据结构教程&#xff08;第五版&#xff09;课后习题参考答案&#xff08;李春葆&#xff09;.pdf 数据结构教…...

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;封装…...

AOSP14 Launcher3——手势上滑关键类AbsSwipeHandler解析

我们来深入分析 quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java 这个非常核心且复杂的类。 1. 核心作用 (Core Role): AbsSwipeUpHandler 是 Quickstep (Launcher3 的手势导航实现) 中处理从屏幕底部上滑手势的核心逻辑抽象基类。它负责管理从手势开始到结束的…...

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

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

Spring Boot(二十一):RedisTemplate的String和Hash类型操作

RedisTemplate和StringRedisTemplate的系列文章详见&#xff1a; Spring Boot&#xff08;十七&#xff09;&#xff1a;集成和使用Redis Spring Boot&#xff08;十八&#xff09;&#xff1a;RedisTemplate和StringRedisTemplate Spring Boot&#xff08;十九&#xff09;…...

使用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;基本思路…...

2025最新系统 Git 教程(七)(完结)

第4章 分布式Git 4.1 分布式 Git - 分布式工作流程 你现在拥有了一个远程 Git 版本库&#xff0c;能为所有开发者共享代码提供服务&#xff0c;在一个本地工作流程下&#xff0c;你也已经熟悉了基本 Git 命令。你现在可以学习如何利用 Git 提供的一些分布式工作流程了。 这一…...

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. 加载数据集 你可以通过…...

聊透多线程编程-线程基础-4.C# Thread 子线程执行完成后通知主线程执行特定动作

在多线程编程中&#xff0c;线程之间的同步和通信是一个常见的需求。例如&#xff0c;我们可能需要一个子线程完成某些任务后通知主线程&#xff0c;并由主线程执行特定的动作。本文将基于一个示例程序&#xff0c;详细讲解如何使用 AutoResetEvent 来实现这种场景。 示例代码…...

论文阅读笔记——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…...

大数据(7.1)Kafka实时数据采集与分发的企业级实践:从架构设计到性能调优

目录 一、实时数据洪流下的技术突围1.1 行业需求演进曲线1.2 传统方案的技术瓶颈 二、Kafka实时架构设计精要2.1 生产者核心参数矩阵2.1.1 分区策略选择指南 2.2 消费者组智能负载均衡 三、实时数据管道实战案例3.1 电商大促实时看板3.2 工业物联网预测性维护 四、生产环境性能…...

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

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

C,C++,C#

C、C 和 C# 是三种不同的编程语言&#xff0c;虽然它们名称相似&#xff0c;但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别&#xff1a; 1. 设计目标和历史 语言诞生时间设计目标特点C1972&#xff08;贝尔实验室&#xff09;面向过程&#…...

MySQL | 三大日志文件

Undo Log&#xff08;回滚日志&#xff09; 实现原理与分类 原理&#xff1a;Undo Log 记录的是数据修改前的旧值&#xff0c;通过这些旧值可以将数据恢复到修改之前的状态。它采用的是逻辑日志&#xff0c;即记录的是如何撤销操作&#xff0c;而不是物理数据的实际值。 分类…...

【网络协议】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;…...

Day14:关于MySQL的索引——创、查、删

前言&#xff1a;先创建一个练习的数据库和数据 1.创建数据库并创建数据表的基本结构 -- 创建练习数据库 CREATE DATABASE index_practice; USE index_practice;-- 创建基础表&#xff08;包含CREATE TABLE时创建索引&#xff09; CREATE TABLE products (id INT PRIMARY KEY…...