字符串是直接从 object 继承的密封类类型。不可以被继承,表示 Unicode 字符串。
前面我们还了解了可以使用@表示禁止转义。

字符串常用属性

Length 返回字符串长度
Chars 指定字符位置的字符


字符串常用方法

IndexOf
IndexOfAny
LastIndexOf
LastIndexOfAny

字符的索引
Insert 指定索引位置插入一个指定的 String 实例
Remove 从此实例中的指定位置开始删除指定数目的字符
PadLeft
PadRight
使用空格或指定的字符填充
Replace 使用新的字符替换原有的字符
Split 按指定的分隔符将字符串转为数组
Substring 查询子串
ToCharArray 将字符串转为字符数组
ToLower
ToUpper
大小写转换
IsNullOrEmpty 是空还是非空字符串
Trim
TrimEnd
TrimStart
去除空格或指定字符

string的本质是char的数组描述形式,可以通过以下的代码来证实
 

1字符串 _职场 string s = "Hello C#";
2字符串 _职场
3字符串 _职场 foreach (char c in s)//string中的每个元素都是char
4字符串 _继承_04 {
5字符串 _密封_07 System.Console.WriteLine(c);
6字符串 _密封_08 }

7字符串 _职场
8字符串 _职场 for (int i = 0; i <= s.Length - 1;i++ )//string就是一个char数组
9字符串 _职场_11 {
10字符串 _密封_07 System.Console.WriteLine(s[i]);
11字符串 _密封_08 }


很多同学对indexof这个方法总感觉莫名其妙,不知道indexof有什么用。indexof有很多地方可以使用。
现看一下indexof的表现
 

1字符串 _职场 string s = "Hello C#";
2字符串 _职场
3字符串 _职场 //仅仅是查找的方向不一样,字符的位置总是从0开始计算
4字符串 _职场 System.Console.WriteLine(s.IndexOf('l'));//2,第3个字符,从前面数第一个l
5字符串 _职场 System.Console.WriteLine(s.LastIndexOf('l'));//3,第4个字符,从后面数第一个l


那indexof和lastindexof有什么具体的作用呢?
 

1字符串 _职场 string s = "-12.23";
2字符串 _职场
3字符串 _职场 if(s.IndexOf('.')!=s.LastIndexOf('.'))
4字符串 _继承_24 {
5字符串 _密封_07 System.Console.WriteLine("小数点不止一个,错误");
6字符串 _密封_08 }

7字符串 _职场
8字符串 _职场
9字符串 _职场 if(s.LastIndexOf('-')>0)
10字符串 _职场_32 {
11字符串 _密封_07 System.Console.WriteLine("符号不止一个或符号不在第一位,错误");
12字符串 _密封_08 }

13字符串 _职场
14字符串 _职场
15字符串 _职场 if (s.LastIndexOf('.') - s.LastIndexOf('-')==1)
16字符串 _继承_40 {
17字符串 _密封_07 System.Console.WriteLine("小数点在符号直接后面,错误");
18字符串 _密封_08 }


其实indexof和lastindexof的处理大致如下

 

1字符串 _职场 string s = "hello";
2字符串 _职场
3字符串 _职场 //indexof
4字符串 _职场 for (int i = 0; i <= s.Length - 1;i++ )
5字符串 _密封_49 {
6字符串 _密封_07 if(s[i]=='l')
7字符串 _职场_53 {
8字符串 _密封_07 System.Console.WriteLine("indexof={0}",i);
9字符串 _密封_07 break;
10字符串 _继承_58 }

11字符串 _密封_08 }

12字符串 _职场
13字符串 _职场 //lastindexof
14字符串 _职场 for (int i = s.Length-1; i >=0; i--)
15字符串 _休闲_63 {
16字符串 _密封_07 if (s[i] == 'l')
17字符串 _休闲_67 {
18字符串 _密封_07 System.Console.WriteLine("lastindexof={0}", i);
19字符串 _密封_07 break;
20字符串 _继承_58 }

21字符串 _密封_08 }




我们来个练习巩固一下

声明一个字符串,且赋值” 我们使用Microsoft Visual Studio .NET 2005 C#开发新一代的应用程序”。
输出 英文字符的个数
输出 标点符号的个数
输出 剩余其他字符的个数

 

1字符串 _职场 char[] c = "我们使用Microsoft Visual Studio .NET 2003 C#开发新一代的应用程序".ToCharArray();
2字符串 _职场 string letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3字符串 _职场 letter += letter.ToLower();
4字符串 _职场 string punctuation = @"~!@#$%^&*()_+|`-=/[]{};':<>?,./";
5字符串 _职场 int li = 0;//英文字符个数
6字符串 _职场 int pi = 0;//标点符号个数
7字符串 _职场 int ci = 0;//其他字符个数
8字符串 _职场 for (int i = 0; i <= c.Length - 1; i++)
9字符串 _字符串_82 {
10字符串 _密封_07 if (letter.IndexOf(c[i]) >= 0)
11字符串 _休闲_86 {
12字符串 _密封_07 li++;
13字符串 _继承_58 }

14字符串 _密封_07 else
15字符串 _继承_92 {
16字符串 _密封_07 if (punctuation.IndexOf(c[i]) >= 0)
17字符串 _继承_96 {
18字符串 _密封_07 pi++;
19字符串 _继承_58 }

20字符串 _密封_07 else
21字符串 _字符串_102 {
22字符串 _密封_07 ci++;
23字符串 _继承_58 }

24字符串 _继承_58 }

25字符串 _密封_08 }

26字符串 _职场 System.Console.WriteLine("总字符个数:{0}", c.Length);
27字符串 _职场 System.Console.WriteLine("英文字符个数:{0}标点符号个数:{1}其他字符个数:{2}合计:{3}",
28字符串 _职场 li, pi, ci, li + pi + ci);



当然,我们可以用char的静态方法来优化上面的代码
 

1字符串 _职场 char[] c = "我们使用Microsoft Visual Studio .NET 2003 C#开发新一代的应用程序".ToCharArray();
2字符串 _职场 int li = 0;//英文字符个数
3字符串 _职场 int pi = 0;//标点符号个数
4字符串 _职场 int ci = 0;//其他字符个数
5字符串 _职场
6字符串 _职场 for (int i = 0; i <= c.Length - 1; i++)
7字符串 _字符串_118 {
8字符串 _密封_07 if (char.IsUpper(c[i]) || char.IsLower(c[i]))
9字符串 _密封_122 {
10字符串 _密封_07 li++;
11字符串 _继承_58 }

12字符串 _密封_07 else
13字符串 _职场_128 {
14字符串 _密封_07 if (char.IsPunctuation(c[i]))
15字符串 _继承_132 {
16字符串 _密封_07 pi++;
17字符串 _继承_58 }

18字符串 _密封_07 else
19字符串 _职场_138 {
20字符串 _密封_07 ci++; ;
21字符串 _继承_58 }

22字符串 _继承_58 }

23字符串 _密封_08 }

24字符串 _职场 System.Console.WriteLine("{0}--{1},{2},{3}:{4}", li + pi + ci, li, pi, ci, c.Length);


spilt是非常有用的方法

 

1字符串 _职场 string dir = @"C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/AppLaunch.exe";
2字符串 _职场
3字符串 _职场
4字符串 _职场 //不使用Split的繁琐代码
5字符串 _职场
6字符串 _职场 int star = 0;
7字符串 _职场 int end = dir.IndexOf('//', star);
8字符串 _职场
9字符串 _职场 do
10字符串 _密封_155 {
11字符串 _密封_07 System.Console.WriteLine(dir.Substring(star, end - star));
12字符串 _密封_07 star = end + 1;
13字符串 _密封_07 end = dir.IndexOf('//', star);
14字符串 _密封_08 }
while (end > -1);
15字符串 _职场 System.Console.WriteLine(dir.Substring(star));
16字符串 _职场
17字符串 _职场
18字符串 _职场 //不使用Split的优雅代码
19字符串 _职场 string[] dirs = dir.Split('//');
20字符串 _职场 foreach (string d in dirs)
21字符串 _字符串_168 {
22字符串 _密封_07 System.Console.WriteLine(d);
23字符串 _密封_08 }

24字符串 _职场
25字符串 _职场 //直接定位文件
26字符串 _职场 System.Console.WriteLine(dir.Split('//')[dir.Split('//').Length - 1]);