C#——string与StringBuilder

本来说好的,有socket的记录的,但是基础知识还没整理完,所以就先不写,等基础知识梳理完毕再进行记录。
那么今天就先记录一下关于string字符串类,还有就是StringBuilder类,它们俩的区别的联系。
OK,那么我们开始进入正题。
首先,我来记录一下,关于string类型的一些琐碎知识:

  • string类型是.NET Framework 中String的别名。
  • string类型其实是一个数组,我们可以使用 [],来找到一个字符串中的某个字符,
    比如:string str="abcdef"; str[1]就是b,注意str[1]是Char类型的字符。
  • string类型是引用类型。
  • 对于连接字符串,我们使用 + 号,比如 string a="as"; a=a+"df"; 这个时候a就是asdf;
  • 对于string类型,关系运算符 “==”和“!=”,我们比较的是string定义的值,而不是其引用的值。比如:
 static void Main(string[] args)
        {
            string a = "hello";
            string b = "h";
            b = b + "ello";
            Console.WriteLine(a==b);
            Console.WriteLine((Object)a == (Object)b);
            Console.ReadKey();
        
        }

这个时候输出的就是True和False了。

  • string类型有个重要的特性:就是不可变性,因为string是引用类型,我们定义一个string类型的时候,定义的值就是堆内存中的某个存储的值的地址,虽然我们可以改变string的值,
    比如string a="string1",a="string2",a的值的确是变了,但是它此时在堆内存中的额引用已经变了,不是string1的引用,而是string2的引用,string1与string2指向的是不同的堆内存位置,这就是string类型的不可变性。
    这也是为什么我们会使用StringBuilder类的原因,因为当我们改变string类型定义的值的时候,相当于我们换了一块堆内存,然后原先的堆内存就会等待着被GC回收掉,这无形中就消耗了性能。
  • 字符串中可以有转义字符,就是比如:\n这样的换行符,但是,有时候我们需要用 \这个符号,怎么办?
    第一种方法:"\n" ,这个时候输出的就是\n了。
    第二中方法:@“\n”,这个时候输出的也是\n。
    还有要注意一下:若要在一个用 @ 引起来的字符串中包括一个双引号,请使用两对双引号,
    比如: string str = @"""Jom"",Hello!";这个时候输出str,就是"Jom",Hello!,要用两对双引号将需要被双引号括起来的字符串引起来。
  • 空字符串与null是不一样的,string a="";string b=null;
    虽然输出的时候,它们两个都是表示空,但是空字符串,它也是一个字符,是一个string对象,相当于System.String.Empty。其Length的长度为0,而输出b.Length的时候,就会报错,null是空,什么字符也不表示。

暂时就想到了那么多,然后呢关于正则表达式,待会也会记录一下。
下面记录一下关于string类型的一些属性方法。
字符串是String类型的对象,它的值是文本。在内部,文本被存储为Char对象的顺序只读集合。C# 字符串末尾没有以 null 结尾的字符;因此 C# 字符串可以包含任意数目的嵌入式 null 字符(“\0”)。字符串的Length属性代表了其所包含的Char字符的数量,而不是Unicode字符数量。
若要访问字符串中的各个 Unicode 码位,请使用 StringInfo 对象。
关于string类型的构造函数:

1.png

也就是说,我们可以使用new运算创建string对象,
比如:char[] array = {'a','b','c'};string a = new string(array);
但是,注意,除了在使用字符数组初始化字符串时以外,不要使用 new 运算符创建字符串对象。
下面记录,一些关于string类型的静态方法,这里只记录一部分,像是什么重载之类的方法就不一一介绍了。
关于字符串比较:

public static int Compare(String strA, String strB);

当然,它还有一些方法重载,这里就不记录了。
比较两个字符串,如果strA“小于”strB 那么返回-1,如果strA“等于”strB 那么返回0,如果strA“大于”strB 那么返回1。

public static bool Equals(String a, String b);

如果 true 的值与 a 的值相同,则为 b;否则为 false。 如果 a 和 b 均为 null,此方法将返回 true。
关于字符串连接:

public static String Concat(String str0, String str1, String str2, String str3);
public static String Concat(String str0, String str1, String str2);

返回一个字符串,是方法参数按照顺序连接在一起。

public static String Concat(params String[] values);

连接指定的string数组的元素,注意关键字 params 表示参数数组没有固定的大小。

关于字符串Copy:

public static String Copy(String str);

创建一个与指定的 System.String 具有相同值的 System.String 的新实例。

关于检索:

public static String Intern(String str);

检索系统对指定 System.String 的引用。如果暂存了 str,则返回系统对其的引用;否则返回对值为 str 的字符串的新引用。

关于判断null:

public static bool IsNullOrEmpty(String value);

指示指定的字符串是 null 还是 System.String.Empty 字符串。如何是空字符串或者null,那么返回true,否则返回false。

关于插入字符:

public static String Join(String separator, params object[] values);串联对象数组的各个元素,其中在每个元素之间使用指定的分隔符。

关于格式化:

public static string Format(string str , Object obj);

将指定字符串中的一个或多个格式项替换为指定对象的字符串表示形式。

静态方法就是那么多,然后就是一些实例方法了。

public object Clone();

返回对此string实例的引用。

public int CompareTo(string strB);

与strB进行比较,如果小于0,则比strB小,如果等于0,则与strB相等,如果大于0,则比strB大。

public bool Contains(string value);

如果value包含在该实例字符串中,则返回true,否则返回false。

public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);

将指定数目的字符从此实例中的指定位置复制到 Unicode 字符数组中的指定位置。
第一个参数: 要复制的此实例中第一个字符的索引。
第二个参数:此实例中的字符所复制到的 Unicode 字符数组。
第三个参数: destination 中的索引,在此处开始复制操作。
第四个参数:此实例中要复制到 destination 的字符数。

public int IndexOf(String value, int startIndex, int count);

报告指定字符串在此实例中的第一个匹配项的从零开始的索引。 搜索从指定字符位置开始,并检查指定数量的字符位置。如果找到该字符串,则为从当前实例的起始位置开始的从零开始的 value 的索引位置;否则为 -1。 如果 value 为 System.String.Empty,则返回值为startIndex。

public string Insert(int index , string value)

将value插入到指定的位置index。

public string Remove(int index);

返回当前实例中从指定位置到最后位置的所有以删除的字符的新字符串。

public string Remove(int index , int count);

返回指定数量字符在当前这个实例起始点在已删除的指定的位置的新字符串。

public string Replace(char oldChar , char newChar);

返回一个新字符串,其中此实例中出现的所有指定 Unicode 字符都替换为另一个指定的 Unicode 字符。

public string Replace(string oldStr , string newStr);

返回一个新字符串,其中当前实例中出现的所有指定字符串都替换为另一个指定的字符串。######public String[] Split(char[] separator, int count);
基于数组中的字符将一个字符串拆分成最大数量的子字符串。 也可指定要返回的子字符串的最大数量。注意返回的是数组。

public String Substring(int startIndex);

从此实例检索子字符串。 子字符串在指定的字符位置开始并一直到该字符串的末尾。

public String Substring(int startIndex, int length);

从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。

public String ToLower();

返回此字符串转换为小写形式的副本。

public String ToUpper();

返回此字符串转换为大写形式的副本。

比较常用和重要的就是这些了。
下面讲一下关于StringBuilder的知识点。
首先,StringBuilder的功能其实和string类型很像,可是为什么会有两个功能相近的东西出现呢?这不是很脑残的事件么?
还记得string的最重要的一个特性吧,那就是不变性!!!
由于string类型的不变性,如果我们反复修改字符串,那么就可能会造成性能上的损失,这个时候,我们可是使用StringBuilder类型。
StringBuilder类型是一个可变字符串类,可变性意味着,一旦创建类的实例后,可以修改通过追加、 删除、 替换或插入字符。
一个 StringBuilder 对象会维护一个缓冲区来容纳扩展到字符串。
如果没有可用空间,将新数据追加到缓冲区否则为系统会分配新的、 更大的缓冲区、 从原始缓冲区的数据复制到新的缓冲区和新的数据则追加到新的缓冲区。
比如,我们在创建一个StringBuilder类型的实例的时候给它20大小的空间,如果20不够,那么它就会自动的增加到40,也就是2倍,但是不会创建新的实例,也就没有了频繁GC,所以性能损耗就会减少。
但是,StringBuilder并非万能的,当遇到如下情况的时候,可以使用string类型:

  • 当对字符串的更改并不频繁时。
  • 当正在执行固定的数量的串联运算,特别是对于字符串文字时。
  • 当需要对字符串执行广泛的搜索操作时,因为StringBuilder缺少如IndexOf这样的方法。

当你遇到如下情况时,可以考虑使用StringBuilder:

  • 当你对字符串进行的更改无法预知时。
  • 当你想对字符串进行大量的更改时。

OK,下面就在记录一些关于StringBuilder类型的属性和方法:
传送门:https://msdn.microsoft.com/zh-cn/library/system.text.stringbuilder.aspx

关于StringBuilder的构造函数:
图片
图片

关于StringBuilder的属性:
图片
图片

关于StringBuilder的方法:
public StringBuilder Append(string str);//它有很多的重载方法。

向实例追加指定的字符串。

public StringBuilder Append(string value , int startIndex , int count);

向此实例追加指定子字符串的副本。

public StringBuilder AppendFormat(string format , object arg);

向此实例追加通过处理复合格式字符串(包含零个或更多格式项)而返回的字符串。 每个格式项都替换为一个参数的字符串表示形式。

public StringBuilder AppendLine(string value);

将后面跟有默认行终止符的指定字符串的副本追加到当前 System.Text.StringBuilder 对象的末尾。

public StringBuilder AppendLine();

将默认的行终止符追加到当前 System.Text.StringBuilder 对象的末尾。

public StringBuilder Clear();

从当前 System.Text.StringBuilder 实例中移除所有字符。

public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);

将此实例的指定段中的字符复制到目标 System.Char 数组的指定段中。

public StringBuilder Insert(int index, string value, int count);

将指定字符串的一个或更多副本插入到此实例中的指定字符位置。

public StringBuilder Insert(int index, string value);

将字符串插入到此实例中的指定字符位置。

public StringBuilder Remove(int startIndex, int length);

将指定范围的字符从此实例中移除。

public StringBuilder Replace(string oldValue, string newValue);
将此实例中出现的所有指定字符串的替换为其他指定字符串。

OK,最后再给一个StringBuilder的例子,就此完结。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      // Create a StringBuilder object with no text.
      StringBuilder sb = new StringBuilder();
      // Append some text.
      sb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
      sb.AppendLine("\n");
      sb.AppendLine("Some code points and their corresponding characters:");
      // Append some formatted text.
      for (int ctr = 50; ctr <= 60; ctr++) {
         sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr));
         sb.AppendLine();
      }
      // Find the end of the introduction to the column.
      int pos = sb.ToString().IndexOf("characters:") + 11 + 
                Environment.NewLine.Length;
      // Insert a column header.
      sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit", 
                                   "Character", "\n"));      

      // Convert the StringBuilder to a string and display it.      
      Console.WriteLine(sb.ToString());      
   }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,784评论 1 10
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,488评论 0 3
  • 前段时间,与妻子一起邀请初中班主任到一家略带文艺的小清新私家厨房共进晚餐,给老师庆祝教师节。 席间一道精致的蛋炒饭...
    猛虎哥阅读 193评论 0 1