Microsoft.Net框架程序设计学习笔记(18):StringBuilder、字符串特定格式与语言文化
时间:2011-03-28 来源:辛勤的代码工
StringBuilder
为了获得更高的性能,StringBuilder的方法并不保证线程安全。如果我们的程序需要对StringBuilder对象做多线程操作,那么我们必须显式添加线程同步代码。
字符串特定格式与语言文化
如果我们希望自己的类型能为调用者提供格式和语言文化选择的话,我们就应该使其实现System.IFormattable接口:
public interface IFormattable
{
String ToString(String format, IFormatProvider formatProvider);
}
format参数告诉方法应该怎样来格式化对象;formatProvider参数是一个实现了System.IFormatProvider接口的类型实例,该类型为ToString方法提供了特定的语言文化信息。
默认情况下,系统使用和调用线程相关联的语言文化信息来格式化字符串。不带参数的ToString方法就是这样实现的。
当我们对数值、日期、时间进行格式化时,语言文化信息将会发挥作用。
当格式化一个数值时,ToString方法会首先查看我们传递给它的formatProvider参数。如果formatProvider参数值为null,那么ToString方法会通过读取属性System.Threading.Thread.CurrentThread.CurrentCulture的值来确定和调用线程相关联的语言文化。该属性返回一个System.Globalization.CultureInfo类型的实例。
利用CultureInfo类型实例,ToString方法会根据格式化的是一个数值、还是一个日期/时间来读取它的NumberFormat或DateTimeFormat属性。这两个属性分别返回一个System.Globalization.NumberFormatInfo或System.Globalization.DateTimeFormatInfo实例。
IFormatProvider接口原型:
public interface IFormatProvider
{
Object GetFormat(Type formatType);
}
IFormatProvider接口背后的基本思想:当一个类型实现该接口时,它的意思是该类型的实例知道如何提供特定语言文化的格式化信息,而和调用线程相关联的语言文化信息应该被忽略。
System.Globalization.CultureInfo类型是FCL中很少的几个实现了IFormatProvider接口的类型之一。另外两个是NumberFormatInfo(对数值进行格式化)和DateTimeFormatInfo(对日期/时间进行格式化)。
如果我们希望获取一个对象的字符串,而又不需要针对任何特殊语言文化进行格式化,那么我们应该调用System.Globalization.CultureInfo的静态属性InvariantCulture,并将其传递给ToString方法的formatProvider参数。
将多个对象格式化为一个字符串
String s = String.Format("On {0:D}, {1} is {2:E} years old.", DateTime.Now, "XiaoMing", 15);
当Format方法分析格式字符串时,它会调用替换参数0实现的IFormattable接口中的ToString方法,并为其传递"D"和null两个参数。类似地,Format也会调用替换参数2实现的IFormattable接口中的ToString方法,并为其传递"E"和null两个参数。如果替换参数的类型没有实现IFormattable接口,那么Format将调用它的无参ToString方法,最后向结果中添加的将为常规格式的字符串。String类型为静态方法Format提供了好几个重载版本,其中一个版本除了接受上面的参数外,还接受一个实现了IFormatProvider接口的对象,这样我们就可以使用自己指定的语言文化信息来格式化所有可替换参数了。
如果我们使用StringBuilder构造字符串的话,我们可以调用StringBuilder的AppendFormat方法。该方法也接受一个格式字符串,且也有一个版本另外接受一个IFormatProvider参数。