1.字符串
由于字符串的不可变性,所以,当我们需要给一个字符串进行大量的拼接、赋值等操作的时候,会产生大量的内存垃圾,所以说,这么做是不合算的。
如果你需要对一个字符串进行大量的重复,拼接等操作,我们推荐使用StringBuilder
2.StringBuilder 和 String 的区别?
答:String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String。
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。
两个类的工作原理不同:
String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。
3.字符串的处理
string可以看做是char的只读数组。char c = s[1];。例子:遍历输出string中的每个元素。
string s = "abcdefg";
Console.WriteLine(s[1]);
结果:b
C#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改。
如果要对char进行修改,那么就必须创建一个新的字符串,用s. ToCharArray()方法得到字符串的char数组,对数组进行修改后,调用new string(char[])这个构造函数来创建char数组的字符串。一旦字符串被创建,那么char数组的修改也不会造成字符串的变化。
string s = "abcdef";
//将字符串转换成char数组
char[] str = s. ToCharArray();
str[0] = 'b';
//输出结果依旧为:abcdef
//将char数组转换成字符串
s = new string(str)
这样结果为:bbcdef
4.字符串常用方法:
注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串的值通过函数返回值的形式返回。
ToLower():
得到字符串的小写形式。
s.ToLower()与s=s.ToLower()
ToUpper():
得到字符串的大写形式;
string lessonOne = Console.ReadLine();
//将一个字符串转换成大写
lessonOne = lessonOne.ToUpper();
// 将一个字符串转换成小写
lessonOne = lessonOne.ToLower();
Trim():
去掉字符串两端的空白。
s1.Equals(s2, StringComparison.OrdinalIgnoreCase):
两个字符串进行比较不区分大小写的比较。
string[] Split(params char[] separator):
将字符串按照指定的分割符分割为字符串数组;
string[] Split(char[] separator, StringSplitOptions options):
将字符串按照指定的char分割符分割为字符串数组( options 取RemoveEmptyEntries的时候移除结果中的空白字符串);
string str = "1988 --, -,- , 10-- ,--05";
char[] chs = { ' ', '-', ',' };
string[] strNew = str.Split(new char[]{' ','-',','},StringSplitOptions.RemoveEmptyEntries);
// 或者
string[] strNew = str.Split(chs,StringSplitOptions.RemoveEmptyEntries);
字符串替换:
string Replace(string oldValue, string newValue)将字符串中的出现oldValue的地方替换为newValue。
取子字符串:
string Substring(int startIndex):
取从位置startIndex开始一直到最后的子字符串;
string Substring(int startIndex, int length):
取从位置startIndex开始长度为length的子字符串,如果子字符串的长度不足length则报错。
bool Contains(string value)
判断字符串中是否含有子串value
*bool StartsWith(string value)
*判断字符串是否以子串value开始;
bool EndsWith (string value)
判断字符串是否以子串value结束;
int IndexOf(string value):
取子串value第一次出现的位置。
Int IndexOf(string value,int startIndex)
提问:
谁说字符串不可变?
string s = “abc”;s=“123”,s这不是变了吗
要区分变量名和变量指向的值的区别。程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。
string s10 = s1;//s10指向s1指向的字符串,而不是s10指向s1,哪怕s1以后指向了其他内存,那么s10还是指向"hello"
补充:
一切类型都可以调用.ToString()方法转换成字符串类型.