数字类型与字符相互转换的三种技术:
Casting: 最优效率,因为编译器产生IL指令来执行转换。C#允许开发者指明checked或unchecked代码以执行转换。
使用System.Convert类型: 提供一些静态方法执行转换,所有这些方法以checked方式执行。抛出OverflowException异常。
使用IConvertible接口: 最缺乏效率的技术,因为在值类型上调用接口方法会产生装箱。大多数类型显示实现接口方法,这意味着调用接口方法之前,必须将实例显示转换为接口。除了GetTypeCode之外的所有方法接受实现了IFormatProvider接口的对象引用,从而允许提供culture信息。抛出System.InvalidCastException异常。
String s = "Hi" + " " + "there.";
编译器在编译时连接所有文字常量,然后仅放置一个string对象在模块的元数据中。如果使用符号+连接非文字常量,连接发生在运行时,这会在垃圾回收堆上创建多个string对象。
逐字字符:
// Specifying the pathname of an application String file = "C:\\Windows\\System32\\Notepad.exe";
// Specifying the pathname of an application by using a verbatim string String file = @"C:\Windows\System32\Notepad.exe";
immutable字符串提供了如下几个好处:
允许在一个字符串上执行多个操作而没有改变该字符串
immutable字符串同时意味着操作或者访问字符串时没有线程同步问题
允许CLR仅通过一个string对象共享多份相同String内容
字符串留用
执行序号(ordinal)相等性检查时,CLR快速测试两个字符串是否包含相同数量的字符。如果答案是否定的,字符串肯定不相等。如果答案是肯定的,CLR还需要比较每个单独的字符。
执行需要注意语言文化的比较时,CLR始终都要比较所有单独的字符,因为两个字符串即使长度不同,也可能是相等的。
虽然Intern方法本身比Equals方法块,但在使用Intern方法时,应用程序的总体性能可能变得更慢。这是因为所有字符串在添加到wordlist数组时,都要花时间对其进行留用。如果应用程序需要使用同一个wordlist来多次调用Intern方法,则该方法会对应用程序的性能和内存利用造成不利影响。这正是C#编译器默认不启用字符串留用功能的原因。
字符串留用就是将字符串保存在一个哈希表里。
字符串操作:
String提供了许多用于处理字符串的静态方法和实例方法,如Insert, Remove, PadLeft, Trim, Concat等。使用这些方法时请牢记一点,他们返回的都是一个新的字符串对象。这是由于字符串是不可变的,已经创建,便不能被修改。