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

c#String和StringBuilder

目录

一,String

1,string的特点:

2,string常用方法

(1)Length

(2)Substring()

(3)ToUpper()

(4)ToLower()

(5)Trim()

(6)Replace()

(7)Contains()

(8)StartsWith()

(9)EndWith()

(10)IndexOf()

(11)LastIndexOf()

(12)Split()

(13)PadLeft()和PadRight()

(14)IsNullOrEmpty()

(15)IsNullOrWriteSpace()

(16)Concat()

(17)Join()

(18)Format()

(19)Compare()和CompareTo()

(20)Normalize()

(21)Equals()

二,StringBuilder

1,可变

2,StringBuilder常用方法

三,string和stringbuilder性能比较

四,何时使用string和stringBuilder

1,使用string

2,使用StringBuilder

五,总结


在c#中string和stringBuilder都用于处理字符串,但是在内层管理和性能上有显著差异。

一,String

1,string的特点:

(1)不可变:string是不可变的,这意味着你每次对字符串进行修改时,都会创建 一个新的字符串,而不是修改原有的字符串

(2)内存管理:在对字符串进行拼接,替换时,c#会创建一个新的字符串对象, 并将新的内容复制到新对象中,这样,如果多次修改的话,可能会导致频繁的内存 分配和垃圾回收,影响性能

例:

string str1 = "Hello";

str1 = str1 + " World";  // 这里会创建一个新的字符串对象

Console.WriteLine(str1);  // 输出: Hello World

2,string常用方法

(1)Length

返回字符串的长度(即字符数)

例:

string str = "Hello, World!";

int length = str.Length;  // 返回 13

(2)Substring()

Substring()方法用于从字符串中提取子字符串

例:

string str = "Hello, World!";

string sub = str.Substring(7, 5);  // 从索引 7 开始,截取 5 个字符

Console.WriteLine(sub);  // 输出: World

(3)ToUpper()

将字符串转换为大写

例:

string str = "hello";

string upperStr = str.ToUpper();  // 输出: HELLO

(4)ToLower()

将字符串转换为小写

string str = "HELLO";

string lowerStr = str.ToLower();  // 输出: hello

(5)Trim()

Trim()方法删除字符串开头和结尾的空白字符

例:

string str = "   Hello, World!   ";

string trimmedStr = str.Trim();  // 输出: Hello, World!

(6)Replace()

Replace()方法用于替换字符串中的字符或子字符串

例:

string str = "Hello, World!";

string newStr = str.Replace("World", "C#");  // 输出: Hello, C#!

(7)Contains()

Contains()方法用于检查字符串是否包含指定的子字符串

例:

string str = "Hello, World!";

bool contains = str.Contains("World");  // 输出: True

(8)StartsWith()

StartsWith()方法检查字符串是否以指定的前缀开始

例:

string str = "Hello, World!";

bool startsWithHello = str.StartsWith("Hello");  // 输出: True

(9)EndWith()

EndsWith()方法检查字符串是否以指定的后缀结尾

例:

string str = "Hello, World!";

bool endsWithExclamation = str.EndsWith("!");  // 输出: True

(10)IndexOf()

IndexOf()方法返回指定子字符串在字符串中的第一次出现的位置。如果未找到,返 回-1

例:

string str = "Hello, World!";

int index = str.IndexOf("World");  // 输出: 7

(11)LastIndexOf()

LastIndexOf()方法返回指定子字符串在字符串中最后一次出现的位置

例:

string str = "Hello, World! Hello!";

int lastIndex = str.LastIndexOf("Hello");  // 输出: 14

(12)Split()

Split()方法用于根据分隔符将字符串拆分成多个子字符串,并返回一个字符串数组

例:

string str = "apple,banana,orange";

string[] fruits = str.Split(',');  // 输出: ["apple", "banana", "orange"]

(13)PadLeft()和PadRight()

PadLeft()方法用于在字符串的左边添加指定数量的空格或字符,直到达到指定的总 长度;PadRight()方法用于在字符串的右边添加字符

例:

string str = "Hello";

string paddedLeft = str.PadLeft(10, '*');  // 输出: "*****Hello"

string paddedRight = str.PadRight(10, '*');  // 输出: "Hello*****"

(14)IsNullOrEmpty()

IsNullOrEmpty()方法用于检查字符串是否为 null 或为空字符串

例:

string str1 = "";

string str2 = null;

bool isEmpty1 = string.IsNullOrEmpty(str1);  // 输出: True

bool isEmpty2 = string.IsNullOrEmpty(str2);  // 输出: True

(15)IsNullOrWriteSpace()

IsNullOrWhiteSpace()方法用于检查字符串是否为 null、空或仅包含空白字符

例:

string str1 = "   ";

string str2 = "";

string str3 = null;

bool isWhiteSpace1 = string.IsNullOrWhiteSpace(str1);  // 输出: True

bool isWhiteSpace2 = string.IsNullOrWhiteSpace(str2);  // 输出: True

bool isWhiteSpace3 = string.IsNullOrWhiteSpace(str3);  // 输出: True

(16)Concat()

Concat()方法用于将多个字符串连接成一个新的字符串

例:

string str1 = "Hello";

string str2 = " ";

string str3 = "World!";

string result = string.Concat(str1, str2, str3);  // 输出: "Hello World!"

(17)Join()

Join()方法用于将字符串数组的元素连接成一个字符串,使用指定的分隔符

例:

string[] words = { "apple", "banana", "orange" };

string result = string.Join(", ", words);  // 输出: "apple, banana, orange"

(18)Format()

Format()方法用于将格式化字符串中的占位符替换为实际的值

例:

string name = "Alice";

int age = 30;

string result = string.Format("My name is {0} and I am {1} years old.", name, age);

// 输出: "My name is Alice and I am 30 years old."

(19)Compare()和CompareTo()

Compare()方法用于比较两个字符串,返回一个整数表示它们的顺序关系。 CompareTo()方法用于将当前字符串与另一个字符串进行比较

例:

string str1 = "apple";

string str2 = "banana";

int comparison = string.Compare(str1, str2);  // 输出: -1,因为 "apple" 小于 "banana"

string str3 = "apple";

int comparisonTo = str3.CompareTo(str2);  // 输出: -1,因为 "apple" 小于 "banana"

(20)Normalize()

Normalize()方法用于将字符串的 Unicode 字符表示标准化,通常用于处理带有合成字符的字符串

例:

string str = "é";  // "e" 和 "´" 的组合字符

string normalizedStr = str.Normalize();  // 输出: "é"

(21)Equals()

Equals()方法用于比较两个字符串的内容是否相等

例:

string str1 = "Hello";

string str2 = "hello";

bool isEqual = str1.Equals(str2, StringComparison.OrdinalIgnoreCase);  // 输出: True

二,StringBuilder

1,可变

stringbuilder是一个可变的字符串构造器,可以在不创建新的字符串对象的情况下对字符串进行修改,这是通过维护一个内部字符数组来实现的,每次修改都会在该数组上进行,而不会创建新的对象

例:

StringBuilder sb = new StringBuilder("Hello");

sb.Append(" World");  // 不会创建新对象,直接在内部字符数组上修改

Console.WriteLine(sb.ToString());  // 输出: Hello World

2,StringBuilder常用方法

(1)Append():将一个字符串追加到当前字符串的末尾

(2)Insert():在指定位置插入一个字符串

(3)Replace():替换字符串中某些字符

(4)Remove():删除字符串中的一部分字符

(5)ToString():将StringBuilder中内容转换为string

例:

StringBuilder sb = new StringBuilder("Hello");

sb.Append(" World");          // 追加 " World"

sb.Insert(5, ",");            // 在位置5插入 ","

sb.Replace("Hello", "Hi");    // 替换 "Hello" 为 "Hi"

sb.Remove(2, 3);              // 删除从索引2开始的3个字符

Console.WriteLine(sb.ToString());  // 输出: Hi, World

三,string和stringbuilder性能比较

在使用string拼接多个字符串时,会生成多个临时的string对象,导致频繁的内层分配 和垃圾回收

使用stringbuilder进行字符串拼接时,只有一个内部缓冲区的字符串数组被修改,效率 较高

例:

// 使用 string 拼接

string result1 = "";

for (int i = 0; i < 10000; i++)

{

    result1 += "a";  // 每次拼接都会生成一个新的 string 对象

}

// 使用 StringBuilder 拼接

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 10000; i++)

{

    sb.Append("a");  // 使用内部字符数组,效率更高

}

string result2 = sb.ToString();

四,何时使用string和stringBuilder

1,使用string

(1)字符串不会频繁变化,例如常量字符串、路径、显示信息等

(2)对性能要求不高的场景,且字符串拼接次数较少

2,使用StringBuilder

(1)在需要频繁拼接、修改字符串的场景,例如循环内拼接字符串、构造动态内 容、日志记录等

(2)当涉及大量字符串操作时,StringBuilder可以显著提高性能,减少内层分配

五,总结

总的来说,如果字符串需要频繁修改,建议使用StringBuilder,如果字符串不需要频繁修改,则使用String


http://www.kler.cn/a/463244.html

相关文章:

  • Rockect基于Dledger的Broker主从同步原理
  • BP神经网络的反向传播算法
  • 树莓派 Pico RP2040 教程点灯 双核编程案例
  • QQ长截屏
  • uni-app tab 双击事件监听
  • Android 第三方框架:网络框架:OkHttp:源码分析:缓存
  • Coding Our First Neurons
  • SpringMVC的工作流程
  • 数据结构————概述
  • Gitee在项目中的运用全解析
  • 65.基于SpringBoot + Vue实现的前后端分离-阿博图书馆管理系统(项目 + 论文PPT)
  • 基于Springboot + vue实现的课程答疑系统
  • 《Vue进阶教程》第三十三课:toRef的使用
  • 【TensorFlow】tensorflow简介和环境搭建、入门
  • 掌握 Stream API - Java 8 的力量
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之12 方案再探之3:特定于领域的模板 之2 首次尝试和遗留问题解决
  • 异常与中断(上)
  • C++设计模式:状态模式(自动售货机)
  • HIVE函数使用案例之----行列转换
  • nginx学习之路-nginx配置https服务器
  • 17爬虫:关于DrissionPage相关内容的学习01
  • 大模型—Ollama将Python函数作为参数传递,增强函数调用功能
  • shell脚本的【算数运算、分支结构、test表达式】
  • PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目
  • OpenCV 特征检测和特征匹配方法汇总
  • 如何使用大语言模型进行事件抽取与关系抽取