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

C#的字符串之String类与StringBuilder类区别于适用场景

一、分清楚值类型与引用类型

正确理解值类型与引用类型,可以更好的帮助软件开发人员写出性能更好且正确稳定运行的程序:

C#值类型与引用类型区别
区别值类型引用类型
定义所有继承自【System.ValueType】类型的都是值类型(valueType继承自System.Object),如常见基础数据类型【byte,short,int,long,float,double,decimal,char,bool 、enum和 struct】都是值类型所有不继承

 【System.ValueType】类型都都是引用类型;对于C#而言所有以【Class】关键字定义的内容都是引用类型;【string、class】都是引用类型

变量赋值

值类型的变量赋值是直接获取到一个真实数据副本

;变量与数据是【一对一的关系】互不影响

引用类型赋值只是把对象的引用赋给变量;

变量与数据对象是【多对一的关系】相互影响

内存分配

【值类型】变量声明后,不管是否已经赋值,编译器为其在【线程栈】分配【静态内存】,【栈内分配空间大小因变量类型而异】

线程栈的空间相对有限,但运行效率比堆高的多

【引用类型】声明一个类时,只在线程栈中分配一小片内存空间用于容纳一个数据对象地址,且此时没有为其分配堆上的数据对象内存空间;只有使用 new 关键字创建一个类的实例时,才会分配堆上的空间,并把堆上空间的地址保存到线程栈上分配的小片空间中

继承结构【值类型】都继承自【System.ValueType】,它们的比较方法【ValueType.Equals(Object)】实现了【数据内容的比较】

【引用类型】都继承自【System.Object】,它们的比较方法【Object.Equals(Object)】实现的是【引用相等性;等效于调用 Object.ReferenceEquals】

System.Object.Equals 方法 - .NET | Microsoft Learn

使用场景

【值类型】在内存管理方面具有更好的效率,并且不支持多态,【适合用做存储数据的载体】

判断使用值类型依据:

①只用于数据存储;

②永远不可能有子类;

③没有多态行为;

【引用类型】支持多态,【适合用于定义应用程序的行为】

C#面向对象的三大特性(封装、继承、多态)

C#的两种类据类型:值类型和引用类型_c# .value2-CSDN博客文章浏览阅读4.7k次,点赞5次,收藏18次。一、什么是值类型,什么是引用类型概念:值类型直接存储其值,而引用类型存储对其值的引用。部署:托管堆上部署了所有引用类型。引用类型:基类为Objcet值类型:均隐式派生自System.ValueType:值类型:byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。..._c# .value2 https://blog.csdn.net/xiaochenXIHUA/article/details/90202915

二、String与StringBuilder都是类属于引用类型

2.1、String类

        字符串是用于表示文本字符的顺序集合(即:string或String是表示System.Char字符的顺序集合,且该顺序集合的值是只读的,不可改变,这意味着只要对string对象的每个操作都会创建新的字符串对象,若涉及大量修改则会在内存中存在大量的字符串对象,占用很多内存字符串可以包含字母、数字或其他符号,在C#中使用英文双引号将字符集合包起来就产生了字符串】);在内存中一个String类对象的字符串最多容纳10亿个字符,大约2GB的空间;

String 类 (System) | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/api/system.string?view=net-9.0

  2.1.1、string与String

        在C#中,string与String没有区别,string是String的一个别名;而String是Sytem命名空间下的一个类;

string str = "测试字符串";
String strS = "测试字符串";
Console.WriteLine($"string内容是【{str}】___String内容是【{strS}】");

  2.1.2、实例化string对象

1、给字符串文本string分配变量

        public static void TestStrObj(){string str = "测试字符串";String strS = "测试字符串";Console.WriteLine($"string内容是【{str}】___String内容是【{strS}】");string str10 = "ABCDaaddfshafs";Console.WriteLine(str10);string str11 = "1234567890";Console.WriteLine(str11);string str12 = "~!@#$%^&*()";Console.WriteLine(str12);string str2 = "路径:C:\\Users\\Public\\Pictures";Console.WriteLine(str2);string str3 = @"C:\Users\Public\Pictures";Console.WriteLine(str3);}

2、调用String类的构造函数

String 构造函数 (System) | Microsoft Learn

        public static void TestStrObj(){//将字符数组转为字符串char[] charArray = {'H','e','l','l','o',' ','W','o','r','l','d' };string stra = new string(charArray);Console.WriteLine(stra);//创建重复字符的字符串string strr = new string('H',9);Console.WriteLine(strr);}

 

3、通过字符串串联运算符+

        public static void TestStrObj(){string name = "字符串";int num = 3;string str = "拼接字符串" + "【你好】" + "CoffeeMilk";Console.WriteLine(str);string str2 = "当前是:" + DateTime.Now.ToString();Console.WriteLine(str2);string str3 = $"测试【{name}】【{num}】";Console.WriteLine(str3);}

 

4、通过格式化方法转为字符串

        public static void TestStrObj(){string name = "字符串";int num = 3;string str = string.Format("这是一个关于{0}格式化的{1}测试", name, num);Console.WriteLine(str);}

 

5、通过检索属性方法

 public static void TestStrObj(){string str = "Today china technology is quilk develop";int startIndex = str.IndexOf(' ') + 1;string newstr = str.Substring(startIndex,5);Console.WriteLine(newstr);string[] strArray = str.Split(' ');string newstr2 = strArray[1];Console.WriteLine(newstr2);}

 

  2.1.3、string的适用场景

 1、对字符串所做的更改数较小; 此时StringBuilder 可能会提供微不足道或没有性能改进 String。

 2、执行固定数量的串联操作时,尤其是字符串文本。 在这种情况下,编译器可以将串联操作合并为单个操作;

 3、在生成字符串时必须执行广泛的搜索操作。 类 StringBuilder 缺少搜索方法,例如 IndexOf 或 StartsWith。 你必须将 StringBuilder 对象转换为这些操作的对象 String ,这可以抵消使用 StringBuilder的性能优势。

2.2、StringBuilder类

        StringBuilder类表示可变字符(char)集合的字符串;这意味着可以直接修改该对象的值(可以通过附加、删除、插入或替换来修改),而不用每次在修改时在内存创建新的对象。其所占的空间会随着内容的增加而自动扩充。

StringBuilder 类 (System.Text) | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/api/system.text.stringbuilder?view=net-9.0

  2.2.1、StringBuilder的实例化与操作

使用 .NET 中的 StringBuilder 类 - .NET | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/standard/base-types/stringbuilder     

如下展示了如何实例化 StringBuilder 类型的对象,及如何对StringBuilder对象执行各种操作(追加、插入、替换、移除)。

需要注意的是StringBuilder的ToString()方法返回的是String类对象。

        public static void TestStrigBuilder(){//创建一个StringBuilder的对象,且预期可容纳64个字符StringBuilder sb = new StringBuilder("这是一个测试",16);//直接在该字符串末尾添加新的字符sb.Append(new char[] {'A','B','C' });//添加格式化的字符串sb.AppendFormat("很高兴认识你{0}{1}","Coffee","Milk");//显示当前的字符串及其长度Console.WriteLine($"【{sb.ToString()}】长度是【{sb.Length}】");//给字符串的指定位置插入内容sb.Insert(4,"【StringBuilder类】");//替换sb.Replace("测试", "操作");Console.WriteLine($"【{sb.ToString()}】长度是【{sb.Length}】");sb.Remove(sb.Length-4,4);Console.WriteLine($"【{sb.ToString()}】长度是【{sb.Length}】");}

概述:如何在 .NET 中设置数字、日期、枚举和其他类型的格式 - .NET | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/standard/base-types/formatting-types#default-formatting-using-the-tostring-method

   2.2.2、StringBuilder的适用场景

 1、当你期望代码在设计时对字符串进行未知数量的更改(如:使用循环中多次对字符串修改);

 2、你期望对字符串内容进行大量的更改操作;

2.3、String类与StringBuilder类的区别

String类与StringBuilder类的区别
特性String类StringBuilder类
可变性

不可变

(一旦创建了String类字符串,字符串内容就不可更改;每次涉及到该字符串的更改【追加、替换、删除等所有操作】都会生成一个新的字符串对象;原字符串内容不变)

可变

创建了StringBuilder对象后,每次对该对象的字符串内容进行各种更改【追加、替换、删除等所有操作】而不会生成新的对象;非常适合频繁更改字符串内容的场景

性能

对字符串大量操作会创建大量新字符串对象,浪费内存;导致性能较低

对字符串大量操作也只会对当前对象内操作,不会创建新对象,内存消耗较少,性能较高
适用场景

①对字符串所做的更改数较小;

②操作固定数量字符串文本串联;

③在生成字符串时必须执行广泛的搜索操作

①你期望代码在设计时对字符串进行未知数量的更改;

②你需要对字符串内容进行频繁修改操作;

三、其他学习资料

StringBuilder与String互转 - 盟约 - 博客园https://www.cnblogs.com/huameitang/p/10528646.html

C#中的字符串, String类和StringBuilder类-腾讯云开发者社区-腾讯云https://cloud.tencent.com/developer/article/1861078如何提高C# StringBuilder的性能_51CTO博客_c# stringbuilderhttps://blog.51cto.com/u_14995043/4627471C# String与StringBuilder - 苍 - 博客园https://www.cnblogs.com/cang12138/p/7323709.htmlC# StringBuilder & String vs StringBuilder (with Performance Comparison) in C# .NET | Pro Code Guidehttps://procodeguide.com/csharp/string-vs-stringbuilder-csharp/

相关文章:

C#的字符串之String类与StringBuilder类区别于适用场景

一、分清楚值类型与引用类型 正确理解值类型与引用类型,可以更好的帮助软件开发人员写出性能更好且正确稳定运行的程序: C#值类型与引用类型区别 区别值类型引用类型定义所有继承自【System.ValueType】类型的都是值类型(valueType继承自Sys…...

关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】

问题需求 目录和文件结构如下: E:\Dir_Level1 │ Level1.txt │ └─Dir_Level2│ Level2.txt│ master.xlsx│└─Dir_Level3Level3.txt现在要在master.xlsx点击单元格进而访问Level1.txt、Level2.txt、Level3.txt这些文件。 方法一:“单元格右键…...

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称,python后边的根据自己的需要,选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …...

计算机网络-网络规划与设计

基本流程 需求分析—》通信规范分析—》逻辑网络设计—》物理网络设计—》实施阶段 需求分析: 确定需求,包括:业务需求、用户需求、应用需求、计算机平台需求、网络通信需求等。 产物:需求规范 通信规范分析: 现有…...

【QA】建造者模式在Qt有哪些应用

#设计模式 #Qt 一、QDomDocument(XML 文档构建) 模式角色: Builder:QDomDocument 本身Product:XML 文档对象Director:用户代码通过 QDomDocument 逐步构建文档结构 示例代码: QDomDocument…...

六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、算法简介 (一)阿尔法进化(Alpha Evolution,AE)算法 阿尔法进化(Alpha Evolution,AE)算法是2024年提出的一种新型进化算法,其核心在于通过自适应基向量和随机步长的…...

练习-依依的询问最小值(前缀和差分)

问题描述 依依有个长度为 n 的序列 a,下标从 1 开始。 她有 m 次查询操作,每次她会查询下标区间在[li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a,使得这 m 次查询的总和最小。 求你求出 m 次查询总和的最小值。 输入格式 第…...

ctfshow web刷题记录

RCE 第一题 eval代码执行 : 1、使用system 加通配符过滤 ?csystem("tac%20fl*") ; 2、反字节执行 xxx %20 echo 反字节 3、变量转移 重新定义一个变量 让他代替我们执行 4、伪协议玩法 ?cinclude$_GET[1]?>&1php://filter/readc…...

MySQL单表查询大全【SELECT】

山再高,往上攀,总能登顶;路再长,走下去,定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…...

考研系列-408真题计算机网络篇(18-23)

写在前面 此文章是本人在备考过程中408真题计算机网络部分(2018年-2023年)的易错题及相应的知识点整理,后期复习也常常用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…...

卷积神经网络(CNN)之 EfficientNet

在深度学习领域,模型的计算效率与性能之间的平衡一直是一个核心挑战。随着卷积神经网络(CNN)在图像分类、目标检测等任务中取得显著成果,模型的复杂度和计算需求也急剧增加。2019年,Google Research 提出的 EfficientN…...

【eNSP实战】将路由器配置为DHCP服务器

拓图 要求: 为 office100 和 office200 分别配置地址池 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.100.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 192.168.200.1 255.255.255.0 AR1路由器上创建office100地址池 [AR1…...

工程化与框架系列(35)--前端微服务架构实践

前端微服务架构实践 🏗️ 引言 随着前端应用规模的不断扩大,微服务架构在前端领域的应用越来越广泛。本文将深入探讨前端微服务架构的实现方案、最佳实践和相关工具。 微服务架构概述 前端微服务架构主要包括以下方面: 应用拆分&#xf…...

Windows系统中安装Rust工具链方法

Windows系统中安装Rust工具链方法 在Windows上使用PowerShell的命令来下载rustup-init.exe文件。 此外,安装完成后,需要确保Rust的环境变量生效,可能需要重启终端或手动执行设置路径的命令。然后继续升级pip并安装tiktoken。 总结步骤应该是…...

Postman下载安装及简单入门

一.Postman简介 Postman是一款API测试工具,可以帮助开发、测试人员发送HTTP请求,与各种API进行交互,并分析响应 二.下载与安装 访问Postman官网(https://www.postman.com/),下载适…...

vulnhub靶场之loly靶机

前言 挑战攻克该靶机30分钟 靶机:loly靶机,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.6 靶机和攻击机都采用VMware虚拟机,都采用桥接网卡模式 文章涉及的靶机及工具,都可以自行访问官网或者项…...

原生微信小程序实现导航漫游(Tour)

效果&#xff1a; 小程序实现导航漫游 1、组件 miniprogram/components/tour/index.wxml <!--wxml--> <view class"guide" wx:if"{{showGuide}}"><view style"{{guideStyle}}" class"guide-box"><view class&quo…...

LLM论文笔记 25: Chain-of-Thought Reasoning without Prompting

Arxiv日期&#xff1a;2024.5.31机构&#xff1a;Google DeepMind 关键词 cot-decoding推理路径pretrain 核心结论 1. LLMs 不需要prompting就可以生成链式推理路径&#xff0c;prompting只是将这些能力显性化的一种手段 2. cot path 往往与更高的model confidence相关&…...

新型XCSSET恶意软件利用增强混淆技术攻击macOS用户

微软威胁情报团队发现了一种新型的XCSSET变种&#xff0c;这是一种复杂的模块化macOS恶意软件&#xff0c;能够感染Xcode项目&#xff0c;并在开发者构建这些项目时执行。 这是自2022年以来的首个已知XCSSET变种&#xff0c;采用了增强的混淆方法、更新的持久化机制以及新的感…...

Redis存数据就像存钱:RDB定期存款 vs AOF实时记账

Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...

[C++面试] 关于deque

一、入门 1、deque与vector的区别 deque的迭代器包含以下信息&#xff1a; 当前缓冲区指针&#xff08;current_buffer&#xff09;当前元素在缓冲区内的位置&#xff08;current&#xff09;中控器的位置&#xff08;map&#xff09; 每次移动迭代器时&#xff0c;需检查是…...

施磊老师c++(七)

STL组件 文章目录 STL组件1.整体学习内容2.vector容器3.deque和listdeque--双端队列容器list--链表容器 4.vector,deque,list对比主要内容面经问题 5.详解容器适配器--stack, queue, priority_queue容器适配器stack-栈queue-队列priority_queue-优先级队列总结 6.无序关联容器关…...

八股文——C 语言宏、`volatile`、`static`、动态内存管理、堆与栈的区别

文章目录 1. #&#xff08;字符串化操作符&#xff09;作用&#xff1a;示例&#xff1a; 2. ##&#xff08;符号连接操作符&#xff09;作用&#xff1a;示例1&#xff1a;动态生成变量名 3. volatile 关键字作用&#xff1a;示例&#xff1a; 4. static 关键字作用&#xff1…...

C++初阶——类和对象(三) 构造函数、析构函数

C初阶——类和对象&#xff08;三&#xff09; 上期内容&#xff0c;我们围绕类对象模型的大小计算&#xff0c;成员存储方式&#xff0c;this指针&#xff0c;以及C实现栈和C语言的比较&#xff0c;进一步认识了C的封装特性。本期内容&#xff0c;我们开始介绍类的默认成员函…...

【Function】使用托管身份调用Function App触发器,以增强安全性

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 1. 背景介绍2. 设置3. 使用Web应用调用Function App触发器(Node.js示例)4. 执行结果此方法允许您使用托管身份(Managed Identity)调…...

x012-MSP430F249智能步进电动百叶窗_proteus_光敏电阻_步进电机_仿真

https://www.dong-blog.fun/post/1997 46 、智能步进电动百叶窗 基本要求&#xff1a; 用一台步进电机控制百叶窗叶片的旋转&#xff08;正转/反转&#xff09; 用 LED 数码管显示旋转角度 设置按键&#xff1a; 手动/自动切换、手动正转和手动反转&#xff0c;停止/启动键 用一…...

牛客周赛85 题解 Java ABCDEFG

A小紫的均势博弈 判断输入的 n 是奇数还是偶数 import java.io.*; import java.math.*; import java.util.*;public class Main {static IoScanner sc new IoScanner();static final int mod(int) (1e97);static void solve() throws IOException {int nsc.nextInt();if(n%2…...

# RAG 框架 # 一文入门 全链路RAG系统构建与优化 —— 架构、策略与实践

本文全面阐述了RAG系统从数据收集、数据清洗&#xff08;包括领域专有名词处理&#xff09;、智能数据分块与QA对生成&#xff0c;到向量化、向量数据库选择与配置&#xff0c;再到检索方式及重排序&#xff0c;直至整合输出、监控反馈和安全保障的全流程。通过这一完整方案&am…...

【Golang】第二弹-----变量、基本数据类型、标识符

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、变量 1.1基本介绍…...

c#:使用Modbus RTU协议

Modbus是一种广泛应用于工业自动化领域的通信协议&#xff0c;支持多种传输方式&#xff0c;如RTU、TCP等。其中&#xff0c;Modbus RTU是一种基于串行通信的协议&#xff0c;具有高效、可靠的特点。本文将详细介绍Modbus RTU协议的基本原理&#xff0c;并重点解析功能码0x03&a…...