----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
一.字符串(String)
1. 创建字符串
① 创建字符串最常用的方式是把一个引号括起来的字符串,称为字符串字面值,例如:
string meg="Welcome to China.";
注意:这种方式创建字符串时,字符串可以包括转义符,如"\n" "\t",都是以反斜线开始。由于反斜线在C#中用作转义字符,所以如果你要在字符串中使用反斜线,而且这个反斜线不是用作转义的时候(如 创建路径 "Mypictures\images"),必须在反斜线前再加一个反斜线。当然除了这种方式以外还有一种方式就是以原样字符串面值创建:以@符号开头来创建字符串。
例如:string message=@"C:\images\pic.jpg";(这样字符串就是保持了原样,并不会转义)
② 创建字符串的另外一种方式是调用对象的ToString()方法,并将结果赋值给一个字符串变量。例如:
int myInteger=4;
string integerString= myInteger.ToString();
2. 字符串的特性
① 字符串的不可变性: 一旦你在程序中声明了一个字符串,这个字符串的内存是永远都不会改变的,除非它被垃圾回收了。例如;
从结果大家可能就能理解了字符串的不可变性是怎么回事了,这里我再将代码改一下让大家知道到底是怎么回事:
将第十三行的代码改为: meg1=meg.ToUpper();然后再在控制台中输出meg1,结果就是大家预期的那样meg中的字符都变成了大写。
由于字符串是不可变的,所以每次修改字符串都是创建了一个新的字符串副本(相当于又拷贝了一个字符串),原来的字符串在内存中是不变的。
② 字符串池:如果在程序中声明了有多个相同的字符串常量,那么系统会为这些字符串创建相同的内存(即共用一个内存),以达到节省内存的作用。例如:
上面的程序中,定义了一个s1字符串变量和s2字符串变量,两个字符串变量值都是相同的,经过调试,然后用即时窗口观察s1和s2中的值内存地址,发现两个内存地址是一样的,所以说如果在程序中声明了有多个相同的字符串常量,那么系统会为这些字符串创建相同的内存,以达到节省内存的作用。
3. 字符串的拼接:字符串的拼接是要用"+",如果两边只要一个是字符串类型,那么另外一个会自动转成字符串类型。
4. 字符串的一些常用的方法和属性
① Length属性 用来求字符串的长度(或者说字符个数)例如:string meg="kdkf"; int m=meg.Length;
② IsNullOrEmpty()方法 用来判断一个字符串是否为null或者为空字符串。这个方法是一个静态方法,直接用string来调用即可。
注意: string s1=""和sting s2=null的区别:
→ string s2=null和string s2 其实这两个是一个意思,都是声明了一个string类型的变量s2,但是并没有赋予一个字符串对象与之相对应,也就是说s2变量并没有指向任何的堆内存。
→ string s1=""和string s1=string .Empty 其实这两个意思是一样,即s1都是指向了一个堆内存,只不过堆内存中保存的是一个空字符串。
③ ToCharArray()方法 用作把一个字符串转换成一个char数组,并且可以对数组中的字符进行修改。
例如: 将”hello world”改成”hillo world”
string s = "hello world";
char[] chars = s.ToCharArray();//将字符串变成char数组
chars[1] = 'i'; //字母e所在的位置为1
s = new string(chars); //得到改变之后的字符数组
Console.WriteLine(s);
④ Equals()方法 用作比较两个字符串是否相同 例如:string s1="AAA";string s2="aaa";
判断s1和s2是否相同: s1.Equals(s2);如果是相同返回true;反之为false;
注意:可以通过 字符串1.Equals(字符串2, StringComparison.OrdinalIgnoreCase))来操作 从而忽略大小写问题。例如:
string s1 = "AaA";
string x = "aAa";
if (s1.Equals(x, StringComparison.OrdinalIgnoreCase) == true)
{
Console.WriteLine("相同");
}
else
Console.WriteLine("不同");
结果输出为相同
⑤ ToUpper()方法 将字符串中所有的字母都转换成大写
ToLower()方法将字符串中所有的字母都转换成小写
⑥ IndexOf()方法这个方法有很多重载的方法,这里只讲两种常见的方法:
int IndexOf(string value) :得到字符串中value第一出现的索引,如果没有找到相应的则返回-1
int IndexOf(string value,int StartIndex):取出从StartIndex位置开始寻找value第一次出现的索引,如果没有找到则返回的值为-1.
例如:
⑦ LastIndexOf()方法 这个方法也有很多重载方法 这里只说一种:
int LastIndexOf(string value): 得到字符串中value最后一次出现的索引
注:其它重载方法和IndexOf()方法差不多。
⑧ Substring()方法用来截取字符串 这里介绍两种重载方法
string Substring(int StartIndex) 从StartIndex位置开始截取字符串(包含StartIndex位置的字符),一直截取到最后。
string Substring(int StartIndex,int length) 从StartIndex位置开始截取字符串而且只截取length个字符。
例如:
string str = "My Names is";
string result = str.Substring(6);
//因为数组的下标是从0开始的,而Names中的s是第7个元素,它的下标为6
Console.WriteLine(result);
//此处结果为输出es is
string result2 = str.Substring(6, 2);
//从下标位置为6的地方开始截取,长
Console.WriteLine(result2);
//结果为 es
⑨ Split()方法 可以根据指定的字符将整个字符串分割
→将字符串按照指定的字符分割:string[] Split(params char[] separtator)(注:有params 修饰的数组,可以直接传元素)
例如: string str = "hello,,,,world,,...";
//将字符串按照’,’和’.’分割,Split方法把分割后的结果作为数组返回
string[] words = str.Split(',', '.');
for(int i=0;i<words.Length;i++) //words.Length是分割之后的words数组长度
{
Console.Write(words[i]);
}
输出结果为;hello world(hello和world中间有3个空格)
⑩ Replace(m,n)方法 将m中的内容替换成n(其中m,n必须同是字符串或者是字符)
例如:
将2013/12/12输出为2011-12-12
string date = "2011/07/05";
date = date.Replace('/', '-');
Console.WriteLine(date);
5. StringBuilder对象
① 因为字符串具有不可变性,所以当多个字符串进行拼接或者累加时,会产生很多垃圾内存,这样会让性能极具下降,这样我们就引入了StringBuilder对象来解决这个问题。例如在一个循环中将许多字符串连接在一起时,可以使用StringBuilder类来提升性能
② 与String不同的是,StringBuilder是可变的,也就是说,修改时改的是实际原字符串,而不是副本。
③ StringBuilder对象仅仅是拼接字符串的工具,大多数情况下还是需要把StringBuilder转换为String
④ StringBuilder类还是提供了许多方法,比如Append()方法 Insert()方法 Remove()方法等
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------