首页 > 编程语言 >C#中的string和stringbuild

C#中的string和stringbuild

时间:2024-09-10 22:20:58浏览次数:9  
标签:string C# StringBuilder stringbuild 字符串 sb Hello

C#中的string

在 C# 中,字符串是一种非常常用的数据类型,用于表示文本信息。C# 中的字符串是通过 System.String 类实现的,它是 .NET Framework 类库中 System 命名空间下的一个类。以下是一些关于 C# 字符串的重要特性和常用操作:

字符串的特性

  1. 不可变性:C# 中的字符串是不可变的,这意味着一旦创建了一个字符串对象,你就不能更改它的内容。对字符串的任何修改都会创建一个新的字符串对象。

  2. 引用类型:尽管字符串在很多情况下表现得像值类型,但它实际上是一个引用类型。

  3. 字面量:可以通过双引号 " 定义字符串字面量,如 string name = "HSL";

  4. Unicode 编码:C# 字符串使用 Unicode 编码(UTF-16),可以存储任何字符。

常用字符串操作

  1. 连接:使用 + 运算符或 string.Concat 方法连接字符串。

    string greeting = "Hello, " + "world!";
    string greeting2 = string.Concat("Hello, ", "world!");

  2. 比较:使用 ==!= 运算符进行值比较,或使用 String.Compare 进行更复杂的比较。

    bool areEqual = "Hello" == "hello"; // False, case-sensitive

  3. 长度和索引:使用 Length 属性获取字符串长度,通过索引访问特定字符。

    int length = "Hello".Length;
    char firstChar = "Hello"[0]; // 'H'

  4. 查找和替换:使用 IndexOfLastIndexOfReplace 等方法。

    int index = "Hello".IndexOf('e'); // 2
    string replaced = "Hello".Replace("e", "a"); // "Hallo"

  5. 拆分和分割:使用 Split 方法将字符串分割为字符串数组。

    char[] delimiters = { ' ' }; // Define delimiter
    string[] words = "Hello world".Split(delimiters); // ["Hello", "world"]

  6. 去除空白:使用 TrimTrimStartTrimEnd 方法去除字符串两端或一端的空白字符。

    string trimmed = "  Hello  ".Trim(); // "Hello"

  7. 转换大小写:使用 ToUpperToLower 方法转换字符串的大小写。

    string upper = "Hello".ToUpper(); // "HELLO"
    string lower = "HELLO".ToLower(); // "hello"

  8. 格式化:使用 string.Format 方法或插值字符串($"")进行字符串格式化。

    string name = "HSL";
    string formatted = string.Format("Hello, {0}!", name); // "Hello, HSL!"
    string interpolated = $"Hello, {name}!"; // "Hello, HSL!"

  9. 插入和删除:使用 InsertRemove 方法在特定位置插入或删除字符。

    string inserted = "Hello".Insert(5, " world"); // "Hello world"
    string removed = "Hello".Remove(5); // "Hell"

  10. 填充和填充空白:使用 PadLeftPadRight 方法填充字符串。

    string paddedLeft = "1".PadLeft(3, '0'); // "001"
    string paddedRight = "1".PadRight(3, '0'); // "100"

  11. 截取子字符串:使用 Substring 方法截取字符串的一部分。

    string sub = "Hello".Substring(1, 3); // "ell"

  12. 检查内容:使用 ContainsStartsWithEndsWith 方法检查字符串内容。

    bool startsWithH = "Hello".StartsWith("He"); // True
    bool endsWithO = "Hello".EndsWith("o"); // True

  13. 正则表达式:使用 System.Text.RegularExpressions 命名空间下的 Regex 类进行复杂的模式匹配和操作。

C#中的stringbuild

在 C# 中,StringBuilderSystem.Text 命名空间中的一个类,它提供了一种可变长度的字符串。与不可变的 string 类型不同,StringBuilder 允许你修改字符串内容而不创建新的字符串实例,这使得在频繁修改字符串内容的情况下更加高效,尤其是在循环中构建字符串时。

以下是 StringBuilder 的一些常用操作和用法:

创建 StringBuilder 实例

using System.Text;
​
StringBuilder sb = new StringBuilder();

追加字符串

sb.Append("Hello, ");
sb.AppendLine("world!");

插入字符串

sb.Insert(7, "beautiful ");

替换字符串

sb.Replace("world", ".NET");

删除字符串

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

清空 StringBuilder

sb.Clear();

获取字符串

string result = sb.ToString();

指定容量和最大容量

StringBuilder sbWithCapacity = new StringBuilder(100); // 初始容量为 100
StringBuilder sbWithCapacityAndMax = new StringBuilder(100, 1000); // 初始容量为 100,最大容量为 1000

使用 StringBuilder 的示例

using System.Text;
​
StringBuilder sb = new StringBuilder();
​
for (int i = 0; i < 10; i++)
{
    sb.Append("Number: ").Append(i).AppendLine();
}
​
string output = sb.ToString();
Console.WriteLine(output);

在这个例子中,StringBuilder 用于构建一个包含 10 行数字的字符串,每行格式为 "Number: [数字]"。

性能注意事项

  • StringBuilder 在频繁修改字符串内容的场景下比字符串拼接(使用 +string.Concat)更高效,因为它避免了创建多个中间字符串实例。

  • 当你知道字符串最终的大小或至少是一个大概的估计时,指定初始容量可以减少内存分配的次数,从而提高性能。

  • 使用 StringBuilderClear 方法重用同一个实例,而不是每次需要时都创建一个新的实例。

C#中的stringbuild和string的区别

在 C# 中,StringBuilderstring 都是处理文本数据的类,但它们在设计和用途上有一些重要的区别:

string 类

  • string 是一个不可变的引用类型,表示文本的序列。

  • 每次对 string 进行修改(如连接、替换等操作)时,都会创建一个新的 string 对象。

  • 由于 string 的不可变性,频繁修改字符串(特别是在循环中)可能会导致性能问题,因为每次修改都会生成新的字符串对象,增加内存分配和垃圾收集的压力。

StringBuilder 类

  • StringBuilder 是一个可变的类,位于 System.Text 命名空间中。

  • 它允许你修改字符串的内容而不创建新的字符串对象,这使得它在频繁修改字符串内容的场景下(如循环中构建字符串)更加高效。

  • StringBuilder 提供了一系列方法,如 AppendInsertRemoveReplace,用于修改字符串内容。

  • StringBuilder 有一个 Capacity 属性,它定义了可以存储的最大字符数。当超出容量时,会自动增加容量。

使用场景

  • 对于少量的字符串操作,或者不需要频繁修改字符串内容的场景,使用 string 是合适的,因为它提供了简洁的语法和足够的性能。

  • 对于需要频繁修改字符串内容的场景,如循环中构建大量文本,或者在处理非常大的文本数据时,推荐使用 StringBuilder 以提高性能和减少内存使用。

示例

以下是使用 stringStringBuilder 的简单示例:

使用 string 连接
string result = "";
for (int i = 0; i < 1000; i++)
{
    result += i.ToString();
}
使用 StringBuilder
using System.Text;
​
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
    sb.Append(i.ToString());
}
​
string result = sb.ToString();

在这个例子中,使用 StringBuilder 可以避免创建多个中间 string 对象,从而提高性能。

总结来说,选择 string 还是 StringBuilder 取决于你的具体需求和性能要求。对于大多数简单的字符串操作,string 是足够的。但是,如果你需要在性能敏感的环境中构建或修改大量文本,StringBuilder 是更好的选择。

标签:string,C#,StringBuilder,stringbuild,字符串,sb,Hello
From: https://blog.csdn.net/2401_86430346/article/details/142110765

相关文章

  • 2024basectf[week3]
    1、复读机这题页面是一个之后在网络中可以看到这个网页的处理器是python而且flag中还有类似于{}这样的字眼,而且还是python处理的,所以就想到了ssti果然,出现了waf,所以基本上就是这个思路+-*/.{{}}__:"\这些好像都被过滤了,还有一些关键字也被过滤了,可以在关键......
  • 为什么Java已经不推荐使用Stack了?
    为什么不推荐使用StackJava已不推荐使用Stack,而是推荐使用更高效的ArrayDeque为什么不推荐使用性能低:是因为Stack继承自Vector,而Vector在每个方法中都加了锁。由于需要兼容老的项目,很难在原有的基础上进行优化,因此Vector就被淘汰掉了,使用ArrayList和CopyOnWriteAr......
  • LeetCode算法—双指针
    一:普通双指针1、题目1:两数求和-1(1)方法1:普通双指针思路:定义两个指针;第一个指针放在数组的首位;第二个指针放在下一个元素的位置;然后遍历这个;如果两个元素的和为目标值就返回对对应的下标和索引值!deffuc(nums,target):foriinrange(len(nums)):forjinrange(i......
  • 72. 编辑距离(leetcode)
    https://leetcode.cn/problems/edit-distance/classSolution{publicintminDistance(Stringword1,Stringword2){//经典题编辑距离//f[i][j]表示word1前i个字符中选择进行操作,word2前j个字符进行选择进行操作相同的最少步数//以word1[......
  • SciTech-Mathmatics-Probability+Statistics-Sampling : Learn Stats for Python III:
    LearnStatsforPythonIII:ProbabilityandSamplingBYIVÁNPALOMARESCARRASCOSAPOSTEDONSEPTEMBER9,2024ProbabilityandSamplingAboutPartIII:ProbabilityandSamplingPartIIIdivesintoappliedprobabilitytheory,concretelybymodelingdiscrete......
  • GCD Queries
    GCDQueries交互题。发现一个结论:对于三个数\(a,b,c\),我们询问\(ga=\gcd(a,c),gb=\gcd(b,c)\)。若\(ga=gb\),则\(c\not=0\)若\(ga>gb\),则\(b\not=0\)若\(ga<gb\),则\(a\not=0\)也就是说,进行两次询问可以排除掉一个位置,那么我们一共只需要进行\(2(n-2)\)次询......
  • C++入门知识
    命名空间为什么会有命名空间?解决C语言中命名冲突的问题。(std是所有c++库的命名空间)解决方法:采用域作用限定符(::):指定编译器搜索的位置。编译器默认的搜索顺序:先局部再全局。命名空间域大体有4种域:全局域、局部域、命名空间域、类域。命名空间域的特点:1.不会影响生命......
  • 挑战不可能篇1——洛谷28分钟14道CCF GESP C++ 一级上机题&洛谷14道题题解
    扯谈今天继续挑战不可能:洛谷28分钟14道题这我个人认为不简单,算上编译、提交、命名等杂七杂八的东东之后,只剩下了大约1分钟/题。本次挑战的是CCFGESPC++一级上机题.这竟然能成功!下面附上每一题第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题......
  • 【05】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-条件渲染+if/switch判断与for/
     序言:本文详细介绍了ArkTs语言中的数组、if单双多分支判断、switch判读、while循环、for循环并给出相应的具体案例和实现代码,附有综合案例京东购物的加购。笔者也是跟着B站黑马的课程一步步学习,学习的过程中添加部分自己的想法整理为笔记分享出来,如有代码错误或笔误,欢迎指正......
  • 使用dnSpyEx对.NET Core程序集进行反编译、编辑和调试
    前言说到.NET相关的反编译工具大家脑海里第一个想到的工具是什么?ILSpy、dnSpy、还是dotPeek?咱们今天的主要内容是讲讲dnSpyEx(dnSpyEx是dnSpy项目的非官方Fork维护版本)这个开源的.NET程序集反编译、编辑和调试工具该如何使用。4款免费且实用的.NET反编译工具.NET反编译神器ILSpy怎么......