1. 概述
本章解释在 MS.Net Framework 中处理单独的字符和字符串的机制。包括 System.Char结构、System.String类、System.Text.StringBuilder类以及System.Security.SecureString类。
2. 名词解释
3. 主要内容
3.1 字符
实现各种数值类型与Char实例的相互转换的三种技术:
① 转型(强制类型转换)。(效率最高)
② 使用 Convert 类型。
③ 使用 IConvertible 接口。(需要装箱,效率最差)
3.2 System.String 类型
String类型直接派生自Object,是一个引用类型。
3.2.1 构造字符串
CLR用一种特殊的方式(ldstr指令)构造文本常量String对象。没有用newobj指令。
3.2.2 字符串是不可变的
几点好处
① 允许在一个字符串上执行各种操作,而不实际的更改字符串。
② 操纵或访问一个字符串时不会发生线程同步问题。
3.2.3 比较字符串
3.2.4 字符串留用
CLR初始化是会创建一个内部哈希表。键是字符串,值是对托管堆中的String对象的引用。
String类提供了两个方法(Intern和IsInterned)来访问这个内部哈希表。
3.2.5 字符串池
3.2.6 检查字符串中的字符和文本元素
3.2.7 其它字符串操作
复制字符串(Clone,Copy,CopyTo,Substring,ToString).
3.3 高效率构造字符串(StringBuilder)
3.3.1 构造 StringBuilder 对象
可以设置 最大容量、容量,可以用Char结构组成的数组来初始化。
3.3.2 StringBuilder 的成员
*StringBuilder代表的是一个可变的字符串(与String不同),大多数成员都能更改字符数组的内容,而且不会重新分配新对象。
只有在长度超过指定容量和调用ToString时,才会重新分配对象。
3.4 获取对象的字符串表示:ToString
定义一个类时,应该总是重写ToString方法,以获得良好的调试支持。
3.4.1 指定具体的格式和语言文化
为了使调用者能选择格式和语言文化,类型应该实现 System.IFormattable 接口。
如果一个类型实现了 IFormatProvider 接口,就认为该类型的一个实例能提供符合语言文化的格式信息。
3.4.2 将多个对象格式成一个字符串
String s = String.Format("On {0:D}, {1} is {2:E} years old. ", new Datetime(2010, 4, 22, 14, 35, 5), "Aidan", 7);
3.4.3 提供定制格式化器
internal sealed class BoldInt32s : IFormatProvider, ICustomFormatter { public Object GetFormat(Type formatType) { if (formatType == typeof(ICustomFormatter)) return this; return Thread.CurrentThread.CurrentCulture.GetFormat(formatType); } public String Format(String format, Object arg, IFormatProvider formatProvider) { String s; IFormattable formattable = arg as IFormattable; if (formattable == null) s = arg.ToString(); else s = formattable.ToString(format, formatProvider); if (arg.GetType() == typeof(Int32)) return "<B>" + s + "</B>"; return s; } }
3.5 解析字符串来获取对象:Parse
3.6 编码:字符和字节的相互转换
FCL提供了一些类型来简化字符编码和解码。两种最常用的方案是 UTF-16 和 UTF-8.
① UTF-16:将每个16位字符编码成2个字节。
② UTF-8:值在0x0080以下的字符压缩成1个字节,0x0080-0x07FF的字符被转换成2个字节,0x0800以及以上的转换成3个字节,代理项对(surrogate pairs)被表示成4个字节。
还有几种不常用的方案:
① UTF-32:使用4个字节来编码所有字符。
② UTF-7:通常用于旧式系统。
③ ASCII编码方案:将16位字符编码成ASCII字符。值小于0x0080的16位字符被转换成单字节,超过0x007F的不能被转换。
*Decoder对象主要用于从一个流中读取字节。
*Base-64:编码和解码是用System.Convert类型提供的一些静态方法来完成的。
3.7 安全字符串(System.Security.SecureString)