5.1 C#字符串类型
字符串是C#内置类型中唯一的引用类型。它具有2个特性:不可变性和密封性。
- 不可变性:字符串一旦创建好就不能再修改了。
- 密封性:不能被继承。
Tips:使用智能感知找到重载方法
举个例子,如果你输入str,输入句点.自动填充好字符串,输入C,并且输入左括号(来填充好Compare,可以看到弹出的智能感知。在智能感知弹出框的左侧,会看到上下箭头,标记为1-8,可以按键盘上下箭头来遍历所有可用的重载方法。
5.1.1 格式化字符串
字符串方法Format可以自定义字符串的外观,返回类型为一个新字符串。
string str2 = "string 2"; string formatString = "{0,15}"; string strResult = string.Format(formatString, str2); Console.WriteLine("string.Format({0}, {1}) = [{2}]\n", formatString, str2, strResult);
这个例子演示了Format方法接受两个字符串参数,第一个参数format String是一个格式项,它将应应用到第二个参数上,下面是输出:
string.Format({0,15}, string 2) = [ string 2]
如果将15改为-15,结果会左对齐[string 2 ]。
strResult = string.Format("Currency: {0:C}, Hex: '{0,2:X}'", 10); Console.WriteLine(strResult);
格式化字符串允许索引有一个冒号分隔符。格式化项{0:C}的结果是货币输出。Hex格式化项既设置了输出大小,又进行了十六进制转换。这次只有一个参数10,但是有两个格式化项,它们都设为索引0,下面是输出:
Currency: $10.00, Hex: ' A'
如果计算机设置为其他地区,输出将符合你的货币符号和其他的标点符号。
标准数字格式化字符串 | 含义 |
C或者c | 货币 |
D或d | 小数 |
E或e | 指数 |
F或f | 固定点 |
G或g | 常规 |
N或n | 数字 |
P或p | 百分比 |
R或r | 往返(确保将浮点转换为字符串,或将字符串转换为符点) |
X或x | 十六进制 |
自定义数字格式化字符串 | 含义 |
0 | 0占位符 |
# | 数字占位符 |
. | 小数点 |
, | 千位分隔符 |
% | 百分比占位符 |
E/e +/- 0 (比如,e+0) | 科学计数法 |
\ | 转义符 |
"XYZ"或'XYZ' | 文本字符串 |
; | 段分隔符 |
其他 | 按其显示的文本 |
5.1.2 比较字符串
- Compare方法:接受两个字符串参数,并且返回int结果如下:
- str1<str2=负数
- str1==str2=零
- str1>str2=正数
- 空字符串""总是比null大
- CompareOrdinal方法:比较两个字符串,而与其本地化无关。
- str1<str2=负数
- str1==str2=零
- str1>str2=正数
- 空字符串""总是比null大
- CompareTo方法:比较了当前实例与参数字符串的值。它产生下面的整数结果:
- this<string=负数
- this==string=零
- this>string=正数
- string is null =1
5.1.3 检查字符串是否相等
检查字符串是否相等的一个快速且常见的方法是使用==操作符。
另外,还可以通过实例或者静态Equals方法来检查是否相等。
eg:
静态Equals方法 boolResult=String.Equals(str1, str2);
实例Equals方法 boolResult=str1.Equals(str2);
5.1.4 连接字符串
- 连接操作符+ eg: strResult=str1+","+str2;
- Concat方法 eg: strResult=String.Concat(str1, str2);
5.1.5 复制字符串
- Copy方法用来返回字符串的副本
string str1 = "string 1"; string strResult; strResult = string.Copy(str1); Console.WriteLine("String.Copy({0}) = {1}", str1, strResult);
输出结果为:
string.Copy(string 1) = string 1;
这个例子说明了Copy方法创建了str1的一个副本,结果是str1的副本放置到了strResult中,与strResult = str1; 是不同的。Copy创建了字符串的一个新的实例。
2. CopyTo方法:如果不想复制整个字符串,只想复制一个子集,可用这个方法,它会将字符串中特定数目的字符复制到字符数组。
char[] charArr = new char[str1.Length]; str1.CopyTo(0, charArr, 0, str1.Length); Console.WriteLine("{0}.CopyTo(0, charArr, 0, str.length) = ", str1); foreach (char character in charArr) { Console.Write("{0} ", character); } Console.WriteLine("\n");
输出如下:
string 1.CopyTo(0, charArr, 0, str1.Length) =
s t r i n g 1
3. Clone方法:返回字符串的一个副本。Clone方法返回一个引用,该引用指向的实例与调用Clone方法的实例相同,与=(赋值)操作符相同。因为Clone方法返回一个object引用,所以返回值在赋值之前,必须强制转换为字符串。eg: strResult=(string)str1.Clone();
5.1.6 检查字符串内容
- StartWith方法:用来确定一个字符串前缀是否与一个特定字符串匹配。
- EndsWith方法:用来判断一个字符串后缀是否与某一个特定字符串匹配。
- Contains方法:如果并不限制子字符串是位于字符串的起始或者末尾,可用此方法。
5.1.7 提取字符串的信息
- IndexOf方法:返回字符串的位置。如果没有找到,返回-1.字符串的出现位置是以0为基准。
- LastIndexOf方法:返回一个字符串或者一组字符在字符串中最后出现的位置。
- SubString方法:从字符串的指定位置获取子字符串。第一个参数是起始位置,第二个参数为长度。
5.1.8 填充和移动字符串输出
- PadLeft方法:右对齐字符串的字符,使用空格(默认)或者指定字符填充左侧。
- PadRight方法:左对齐字符串的字符,使用空格(默认)或者指定字符填充右侧。
- Trim方法:从一个字符串的起始或末尾移除空白字符或者指定的字符集。如果只关心移除字符串的一边,也可以使用TrimEnd或者TrimStart.
5.1.9 更改字符串的内容
- Insert方法:返回一个字符串,在初始字符串的指定位置放置了一个指定的字符串。
- Remove方法:从字符串的某一位置删除指定数目的字符。
- Replace方法:用来将出现的所有字符或者字符串替换为一个新的字符或者字符串。
- ToLower方法:返回一个转换为小写字符的字符串副本。
- ToUpper方法:返回一个转换为大定字符的字符串副本。
Tips:修改字符串
严格地说,我们从未真正修改过字符串。字符串是不可变的,这意味着它无法改动。调用例如Insert, Remove或者Replace这样的方法时,实际上是CLR创建了一个新的字符串对象,并且返回对这个新字符串对象的引用。初始的字符串对象从未改变过。
任何时候看到在字符串上进行了这些操作,认为它应该改变的时候,都应该记住:事实上,只是将操作的结果赋值给了一个新的字符串变量。赋值字符串操作的结果给同样的变量也有效,它公公是将新字符串对象的引用赋值给了同样的变量。
5.1.10 分离和结合字符串
- split方法:提取由特定字符集分隔的单独字符串,并且将这些字符串中的每一个都放置到一个字符串数组中。
- Join方法:使用一个位于两个字符串之间的特定分隔符来连接它们。John方法是静态的,你需要在string类型上调用它。
5.1.11 操作字符串字符
- Length属性:返回字符串中字符的数目。
- 字符串索引器:返回字符串中指定位置的字符。索引器就是一对方括号,通常在数组中使用,用于访问对象中的元素。eg:str1[3]
- ToCharArray方法:从一个字符串中将字符复制到一个字符数组中。
5.1.12 通过驻留池影响CLR字符串处理
Intern方法:返回一个字符串的引用,该字符串位于一个称作驻留池(intern pool)的地方。该方法接受一个以编程方式创建的字符串参数,并且返回驻留池中对同一字符串的引用。
string str1 = "string 1"; string objStr1 = string.Concat("string ", "1"); string internedStr1 = string.Intern(objStr1); Console.WriteLine("(object)objStr1 == (object)str1 is {0}\n", ((object)objStr1 == (object)str1)); Console.WriteLine("(object)internedStr1 == (object)str1 is {0}\n", ((object)internedStr1 == (object)str1));
第一个结果是False,第二个结果是true。详情见P82.