一,字符Char
1,Char主要用来存储单个字符,占用16位(两个字节)的内存空间。在定义字符变量时,要使用单引号,如'a'表示一个字符,“a”表示一个字符串。
Char常用的方法如表1所示
表1 Char类常用方法及说明
方法 | 说明 |
IsControl | 指示指定的Unicode字符是否属于控制类字符类别 |
IsDigit | 指示某个Unicode字符是否属于十进制数字类别 |
IsHighSurrogate | 指示指定的char对象是否为高代理项 |
IsLetter | 指示某个Unicode字符是否属于字母类别 |
IsLetterOrDigit | 指示某个Unicode字符是属于字母类别还是属于十进制数字类别 |
IsLower | 指示某个Unicode字符是否属于小写字母类别 |
IsLowSurrogate | 指示指定的char对象是否为低代理项 |
IsNumber | 指示某个Unicode字符是否属于数字类别 |
IsPunctuation | 指示某个Unicode字符是否属于标点符号类别 |
IsSeparator | 指示某个Unicode字符是否属于分隔符类别 |
IsSurrogate | 指示某个Unicode字符是否属于代理项字符类别 |
IsSurrogatePair | 指示两个指定的Char对象是否形成代理项对 |
IsSymbol | 指示某个Unicode字符是否属于符号字符类别 |
IsUpper | 指示某个Unicode字符是否属于大写字母类别 |
IsWhiteSpace | 指示某个Unicode字符是否属于空白类别 |
Parse | 将指定字符串的值转换为它的等效Unicode字符 |
ToLower | 将Unicode字符的值转换为它的小写等效项 |
ToLowerInvariant | 使用固定区域性的大小写规则,将Unicode字符的值转换为其小写等效项 |
ToString | 将此实例的值转换为其等效的字符串表示 |
ToUpper | 将Unicode字符的值转换为它的大写等效项 |
ToUpperInvariant | 使用固定区域性的大小写规则,将Unicode字符的值转换为其大写等效项 |
TryParse | 将指定字符串的值转换为它的等效Unicode字符 |
char a = 'a';
char b = '8';
Console.WriteLine("a是否为字母 {0}",char.IsLetter(a));
Console.WriteLine("b是否为数字 {0}", char.IsDigit(b));
Console.ReadLine();
2,转义字符
转义字符是一种特殊的字符变量,其以反斜线“\”开头,后跟一个或多个字符。转义符“\”(单个反斜杠)只针对后面紧跟着的单个字符进行操作。
表2 转义字符
转义符 | 说明 |
\n | 按Enter键换行 |
\t | 横向跳到下一制表位置 |
\” | 双引号 |
\b | 退格 |
\r | 按Enter键 |
\f | 换页 |
\\ | 反斜线符 |
\’ | 单引号符 |
二,字符串String
在C#中由双引号(“”)包围的都是字符串,不能作为其他数据类型来使用。
声明字符串变量必须经过初始化才能使用。
1,连接多个字符串。使用“+”运算符可完成对多个字符串连接的功能。
string s1 = "A";
string s2 = "8";
Console.WriteLine("s1+s2为: {0}", s1+s2);
2,比较字符串
对字符串值进行比较时,可以使用比较运算符“==”实现。也可以使用常用的比较字符串的方法Compare()、CompareTo()、Equals()方法。
a,采用“==”比较
string s1 = "A";
string s2 = "8";
Console.WriteLine(s1==s2);
b,采用Compare()方法
string s1 = "A";
string s2 = "B";
Console.WriteLine(string.Compare(s1, s2));//s1<s2,输出结果为-1
Console.WriteLine(string.Compare(s2, s1));//输出结果为1
c,采用CompareTo()
如果s1的值与s2的值相等,则返回0;如果s1大于s2的值,则返回1,否则返回-1
string s1 = "A";
string s2 = "B";
Console.WriteLine(s1.CompareTo(s2));//值为-1
d,采用Equals()方法
如果s1的值等于s2的值,返回true,否则为false
string s1 = "A";
string s2 = "B";
Console.WriteLine(s1.Equals(s2));//false
Console.WriteLine(string.Equals(s1,s2));//false
3,格式化字符串
表3 用于日期时间的格式规范
格式规范 | 说明 |
d | 简短日期格式(YYYY-MM-dd) |
D | 完整日期格式(YYYY年MM月dd日) |
t | 简短时间格式(hh:mm) |
T | 完整时间格式(hh:mm:ss) |
f | 简短的日期/时间格式(YYYY-MM-dd hh:mm) |
F | 完整的日期/时间格式(YYYY年MM月dd日 hh:mm:ss) |
g | 简短的可排序的日期/时间格式(YYYY-MM-dd hh:mm) |
G | 完整的可排序的日期/时间格式(YYYY-MM-dd hh:mm:ss) |
M或m | 月/日格式(MM月dd日) |
Y或y | 年/月格式(YYYY年MM月) |
DateTime s1 = DateTime.Now;
string s2 = string.Format("{0:D}", s1);//按完整日期格式输出
Console.WriteLine(s2);
4,截取字符串
String 类提供了Substring()方法,该方法可以截取字符串中指定位置和长度的字符串。语法如下:
public string Substring(int startindex,int length)
startindex:子字符串的起始位置索引。length:子字符串中的字符数。
如果length的长度大于截取字符串的长度,将从起始位置处截取之后的所有字符。
string s1 = "12345678";
string s2 = "";
s2 = s1.Substring(2, 4);
Console.WriteLine(s2);//输出结果为3456
5,分割字符串
String类提供了一个Split()方法用于分割字符串,此方法的返回值是包含所有分割字符串的数组对象,可以通过数组取得所有分割的子字符串。语法如下:
public string[] Split(params char[]separator)
separator:是一个数组,包含分隔符。
string s1 = "12345,6789";
char[] s2 = { ','};//创建一个分隔符
string[] s3=new string[100];//创建一个数组,接收分割后的字符串
s3= s1.Split(s2);
for (int i = 0; i < s3.Length; i++)
{
Console.WriteLine(s3[i]);//输出结果为12345 6789
}
6,插入和填充字符串
6.1 插入字符串。String类提供了Insert()方法,用于向字符串的任意位置插入新元素,语法如下
public string Insert(int startindex,string value);
startindex:用于指定所要插入的位置,索引从0开始。
string s1 = "1234";
string s2 = "abc";
string s3=s1.Insert(2, s2);
Console.WriteLine(s3);//输出结果为:12abc34
6.2 填充字符串。string类提供了PadLeft()/PadRight()方法用于填充字符串,PadLeft()方法在字符串的左侧进行字符串填充,而PadRight()方法在字符串的右侧进行填充。语法如下
public string PadLeft(int totalwidth,char paddingchar);
totalwidth:指定填充后的字符串长度。paddingchar:指定所要填充的字符,如果省略,则填充空格符号
string s1 = "1234";
string s2 = s1.PadLeft(5,'(');
string s3 =s2.PadRight(6,')');
Console.WriteLine(s3);//输出结果为:(1234)
7,删除字符串。string类提供了Remove()方法,用于从一个字符串的指定位置开始,删除指定数量的字符,语法如下
public string Remove(int startindex);//删除从指定位置到最后位置的所有字符
public string Remove(int startindex,int count);//从指定位置开始删除指定书面的字符
startindex:用于指定开始删除的位置,索引从0开始;count:指定删除字符数量。
string s1 = "12345678";
string s2 = s1.Remove(2);
string s3 = s1.Remove(2,3);
Console.WriteLine(s2);//出错结果:12
Console.WriteLine(s3);//输出结果:12678
8,复制字符串
String提供了Copy()和CopyTo()方法,用于将字符串后子字符串复制到另一个字符串后Char类型的数组中。
8.1 Copy()方法。创建一个与指定的字符串具有相同值的字符串的新实例。语法如下
public static string Copy(string str);//str:是要复制的字符串
string s1 = "12345";
string s2 =string.Copy(s1);
Console.WriteLine(s2);//输出结果为:12345
8.2 CopyTo()方法,可以将字符串的某一部分复制到另一个数组中,语法如下
public void CopyTo(int sourceindex, char[] destination,int destinationindex,int count)
sourceindex:需要复制的字符的起始位置。
destination:目标字符数组。
destinationindex:指定目标数组中的开始存放位置。
count:指定要复制的字符个数。
string s1 = "12345";
char[] s2 = new char[100];
s1.CopyTo(1, s2, 0, 2);//索引从1开始复制s1字符串,复制两个字符,从索引0开始存放到s2中
Console.WriteLine(s2);//输出结果为:23
9,替换字符串
String提供了Replace()方法,用于将字符串中的某个字符或字符串替换成其他的字符或字符串。
public string Replace(char Ochar,char Nchar);
public string Replace(string Ovalue, string Nvalue);
Ochar:待替换的字符。Nchar:替换后的新字符。
Ovalue:待替换的字符串。Nvalue:替换后的字符串。
string s1 = "12345";
string s2 = s1.Replace("234", "abc");//用"abc",替换s1中的"234"
Console.WriteLine(s2);//输出结果是:1abc5
三,可变字符串类StringBuilder
1, 对于创建成功的字符串对象,它的长度是固定的,内容不被改变和编译。当对字符串进行修改时,会在内存中创建新的字符串对象,如果重复地对字符串进行修改,将极大地增加系统开销。而C#提供了一个可变的字符序列StringBuilder,大大提高了频繁增加字符串的效率。
StringBuilder创建对象方式:
StringBuilder s1 = new StringBuilder();
StringBuilder类存在于System.Text命名空间中,如果要创建StringBuilder对象,首先必须引用此命名空间。
StringBuilder类常用的方法及说明
方法 | 说明 |
Append | 将文本或字符串追加到指定对象的末尾 |
AppendFormat | 自定义变量的格式并将这些值追加到StringBuilder对象的末尾 |
Insert | 将字符串或对象添加到当前StringBuilder对象中的指定位置 |
Remove | 从当前StringBuilder对象中移除指定数量的字符 |
Replace | 用另一个指定的字符来替换StringBuilder对象内的字符 |
StringBuilder s1 = new StringBuilder("12345");
Console.WriteLine(s1);
s1.Append("abc");
Console.WriteLine(s1);//输出结果为:12345abc
s1.Insert(0, "m");
Console.WriteLine(s1);//输出结果为:m12345abc
s1.Remove(1, 2);
Console.WriteLine(s1);//输出结果为:m345abc
s1.Replace("m","xy");
Console.WriteLine(s1);//输出结果为:xy345abc
s1.AppendFormat("{0:C}", 1000);
Console.WriteLine(s1);//输出结果为:xy345abc¥1000.00
2,StringBuilder类与String类的区别
String对象是不可改变的,每次使用String类中的方法时,都要在内存中创建一个新的字符串对象,这就需要为该新的对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用StringBuilder类。
例如,当在一个循环中将许多字符串连接在一起时,使用StringBuilder类可以提升性能。