第十四章 字符、字符串和文本处理

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)

你可能感兴趣的:(字符串)