第四节:C#字符与字符串
1、Char类
C#中的char 类型作用比较单一,只能用来表示表示单个字符,外包单引号。而且不同于C,char 类型不能由整型数隐式转换。比如C中:
Char b=97;(sensible)
而C#中:
Char b=97;(Error)
这样看来,char类型在C#未免有些死板,用处有限。
2、String类
C#中的String类是命名空间自带的类型,不需要像C++那样包含头文件“string“,其他的用法和C++中的类似。但需要初始化后再使用,否则会报出”使用了未赋值的变量“。
如C++中:
string s;
s+=”123”;(sensible)
而C#中:
String s;
s+=”123”;(error)
3、字符串比较
C#中的字符串比较除了==外,主要还用compare(),compareto()和Equals()等方法,这些方法都属于string类。
Compare方法是string类的静态方法,所以可以直接类名引用。
如:String.Compare(str1,str2);
而CompareTo是对象方法,是以实例对象本身与指定的字符串比较,范式如:
Str1.CompareTo(str2);
Equals()即可以是类方法也是对象方法,所以以下都是无误的:
Str1.Equals(str2);
String.Equals(str1,str2);
4、格式化字符串
C#中提供了一个静态的Format方法,用于将字符串数据格式化成指定的格式。
Format参数由零或多个文本序列与零或多个索引占位符混合组成,其中索引占位符称为格式项,它们与此方法的参数列表中的对象相对应。格式设置过程将每个格式项替换为相应对象值的文本表示形式。格式项的语法是{索引[,对齐方式][:格式字符串]},它指定了一个强制索引、格式化文本的可选长度和对齐方式,以及格式说明符字符的可选字符串,其中格式说明符字符用于控制如何设置相应对象的值的格式。
在实际开发中,C#支持的标准数据格式更多样:
C或c | 货币 | 货币值 | ¥123或-¥123.456 |
D或d | Decimal | 整型数,可负 | 1234或-001234 |
E或e | 科学计数法 | 科学计数法 | 1.052E+03或-1.05e-03 |
P或p | 百分比 | 百分数 | 100.00%或100% |
X或x | 十六进制 | 十六进制字符串 | FF或00ff |
此外C#为不同地区做了地方化处理,比如可以按照中文习惯将日期表示为不同格式,这里列举两种:
d 简短日期格式:YYYY-MM-dd
D 完整日期格式:YYYY年MM月dd日
5、字符串分割
String类提供了一个Split方法,用于分割字符串,返回包含所有子串的字符串数组。不同于Python的split,C#的split分割参数为字符数组,即char[]。示例如下:
6、StringBuilder类
既然已经有了String类,StringBuilder类是如何产生的呢?对于已经成功创建的字符串对象,他的长度是固定的,内容不能被改变和编译。虽然能用+运算符附加新字符或字符串,但“+“会产生一个新的String实例,会在内存中创建一个新的字符串对象。如果重复地对字符串进行修改,会极大地增加系统开销。因此C#提供了一个可变的字符序列StringBuilder类,从而大大提高了频繁增加字符串地效率。
StringBuilder类存在于System.Text命名空间中。
StringBuilder最常用的构造方法如;
StringBuilder Str=new StringBuilder(“Hello world!”);
StringBuilder类常用的方法有:
Append() 将文本或字符串加入到对象末尾。
AppendFormat() 自定义变量格式并加到末尾。
Insert() 插入字符串或对象到指定位置。
Remove() 从对象中移除指定数目字符。
Replace() 用另一个字符或串来替代StringBuilder对象内的字符。
我们可以用一段代码来检验String和StringBuilder的效率。
可以明显看出两者执行效率上的巨大差距。
由于String对象是不可改变的,每次使用String类中的方法时,都要在内存中分配新的空间来创建一个新的字符串对象。在重复修改的情况下,这种开销可能会非常昂贵。所以如果要修改字符串而不创建新对象,可以使用StringBuilder提高性能。