C#字符串操作概念的理解浅析

开发 后端
C#字符串操作之前呢我们要明白C#字符串的一些概念,这里我们向你介绍了Sting、string以及StringBuilder等等C#字符串操作要了解的概念。

C#字符串操作之概念的理解在实际的开发过程中,对字符串的操作是经常遇到的,其中涉及到字符串拼接、拆分、比较、替换等操作。C#提供了string类型,String和StringBuilder两种类来对字符串进行处理。那么string,String,StringBuilder对字符串进行处理有何异同,在实际编程中,对于不同的字符串操作应该采用哪种方式来提高程序的效率呢?本文将对string,String,StringBuilder进行详细的解释和比较,最后在编程过程中遇到的常用的字符串处理进行了总结。

首先让我们理解string,String,StringBuilder的概念

C#字符串操作之string

string,msdn给出的解释就是,string 是C#中的关键字,并且是引用类型, string 类型表示零或更多 Unicode 字符组成的序列。string 是 .NET Framework 中 String 的别名。但定义相等运算符(== 和 !=)是为了比较 string 对象(而不是引用)的值(后面给出示例解释这点)。

C#字符串操作之String:

String是类,表示文本,即一系列 Unicode 字符。String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。如:当我们实例化一个String的对象后,在内存中为此对象分配一个空间。如下:String str = “hello”;当我们修改str的值的时候,如:str = “hello world”;此时,系统会为str重新分配一个空间。这样原来的内存空间就被浪费掉了,只能等待垃圾回收器回收。在需要对字符串执行重复修改的情况下,与创建新的 String对象相关的系统开销可能会非常昂贵。

C#字符串操作之String与string的区别:

string 是 .NET Framework 中 String 的别名,string是C#基元类型(primitive),简单来说就是编译器直接支持的数据类型。基元类型要直接映射到Framework类库(FCL)中的类型,例如,C#中一个基元类型int直接映射到System.Int32类型,这里int是基元类型,System.Int32是FCL类型。而String是FCL类型的,所以在C#的编译时,会自动的把string转化为System.String。所以string与String实质上没什么区别,只是在使用string要做一次转换,转换为String。因此,在编码时我们推荐使用String。

string虽然为引用类型,但是(== 和 !=)是为了比较 string 对象(而不是引用)的值。

  1. string a = "hello";  
  2. string b = "hel";  
  3. b = b + "lo";  
  4. string c = "hello";  
  5. Response.Write(a==b); //True  
  6. Response.Write((object)a == (object)b); //False  
  7. Response.Write((object)a == (object)c); //True 

a==b比较的是值而非引用。所以a==b为True。当创建多个字符串内容相同的对象时,都只会指向同一个引用; a和c都指向同一个a的引用,并不会为c重新分配内存;这样即可保证内存有效利用;所以上面的(object)a == (object)c比较的是a与c的引用,结果为True。这里面b由于进行了累加操作(b = b + "lo";)b又重新分配了内存,所以(object)a == (object)b比较的是引用,所以为False。

接下来我们再通过几个例子来理解下String(string)

  1. String str1 = "abc";  
  2. String str2 = str1;  
  3. str1 = "123";  
  4. Response.Write(str2);//abc 

输出结果是abc,首先给str赋值为"abc",接着执行str2 = str1,使str2和str1指向同一引用,即内存地址。当执行str1 = "123"后,String对象是不可改变的,实质上str1 = "123"是str1=new string("123")的简写,它的每一次赋值都会抛掉原来的对象而生成一个新的字符串对象,分配新的内存空间,str1 = "123"语句编译器私底下创建了一个新的字符串对象来保存新的字符序列"123",也就是此str1已非彼str1了。因此str1的值的改变也就不能影响先前str1指向地址的值了,当然str2的值也就不会改变了。因此string是不可改变的。
通过上面的例子,如果我们执行下面这些语句:

  1. String sql = “Select * From T_Test ”;  
  2. sql += “Where id=888 ”;  
  3.         sql += “And type=3 ”;  
  4. sql += “Order By Desc”; 

实际上这样是十分浪费内存空间的。如果是频繁的这样做的话,建议是使用StringBuilder对象,或者这样写:

  1. String sql = “Select * From T_Test” +   
  2.  
  3. “Where id=888 ” + “And type=3” + “Order By Desc ” ;  

C#字符串操作之StringBuilder:

出于性能方面的考虑,大量的串联或所涉及其他字符串操作应通过StringBuilder类来执行。StringBuilder表示可变字符字符串, 它允许我们有效的对字符串的字符执行动态操作,有效的缩减字符串的大小或者更改字符串中的字符。如果字符串变大,超过已经分配的字符的大小,StringBuilder就会自动的分配一个全新的、更大的数组,并开始使用新的数组,虽然 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数之一来指定 StringBuilder 类的容量。

String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。String 串联操作每次都分配内存,而 StringBuilder 串联操作仅当 StringBuilder 对象缓冲区太小而无法容纳新数据时才分配内存。因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;例如,某个循环对用户输入的任意数量的字符串进行串联

C#字符串操作的概念就向你介绍到这里,希望对你了解和学习C#字符串操作有所帮助。

【编辑推荐】

  1. C#动态二维数组函数处理方案
  2. C#集合、C#动态数组的概念浅析
  3. C#动态数组的详解介绍
  4. C#动态数组的应用详解实例
  5. C#数组复制方法详解
责任编辑:仲衡 来源: it168.com
相关推荐

2009-08-24 13:04:44

操作步骤C#字符串

2009-08-11 10:26:49

C#算法C#字符串反转

2009-09-01 17:50:23

C#截取字符串

2009-09-03 18:45:06

GridView格式化

2009-09-02 10:58:02

C#动态数组

2009-08-20 14:31:55

C#正则表达式字符串

2009-09-01 17:58:55

C#截取字符串

2009-08-24 14:26:42

C# 泛型类

2009-09-14 13:44:14

Lambda ExprC# Lambda

2009-09-02 16:21:20

C#字符串

2009-08-21 16:37:54

C#客户端程序

2009-08-28 10:50:17

C#字节数组转换成字符

2009-08-21 16:27:44

C#服务端程序

2009-08-07 14:15:21

C#字符串分割

2009-08-24 17:06:37

C#字符串

2009-08-06 16:01:09

C#字符串函数大全

2009-08-26 13:24:54

C#字符串

2009-08-07 14:22:56

C#字符串搜索

2009-08-07 14:34:33

C#模式字符串

2009-08-07 13:50:11

C#字符串
点赞
收藏

51CTO技术栈公众号