本章将介绍.net中处理字符和字符串的机制
字符
在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发。
每个字符都表示成System.Char结构(一个值类型) 的一个实例。System.Char类型提供了两个公共只读常量字段:MinValue(定义成"\0")和MaxValue(定义成'\uffff')。
为char实例调用静态GetUnicodeCategory方法,这个方法返回的是System.Globalization.UnicodeCategory枚举类型的一个值。这个值支出该字符是控制字符、货币符号、小写符号、大写符号、标点符号、数学符号,还是其他字符(Unicode定义的字符)。
为了简化开发,Char类型还提供了几个静态方法,比如IsDigit,IsLotter,IsUpper,IsLower,isNumber等。其中大多数方法都在内部调用了GetUnicodeCategory,并简单的返回true和false。注意,所有这些方法要么获取单个字符作为参数,要么获取一个string以及目标字符在这个string中的索引作为参数。
另外可调用ToLowerInvariant和ToUpperInvariant,以忽略语言文化(culture)的方式,将一个字符转换成小写和大写形式。作为另一种替代方案,ToLower和ToUpper方法将字符转换成小写和大写形式,但是转换时要使用与调用线程关联的静态CurrenCulture属性来获得。ToLower和ToUpper之所以需要语言文化信息,是因为字母大小写的转换是依赖于语言文化的。不同的语言文化,大小写的形式也不尽相同(土耳其的大写字母I上面会多一个点,是U+0130)。
除了这些静态方法,char类型还有自己的实例方法。其中,equals方法在两个char实例代表同一个16位Unicode码位的前提下返回true。CompareTo方法返回两个char实例的忽略语言文化的比较结果。
可以使用三种技术实现各种数值类型与Char实例的相互转换:
1) 转型(强制类型转换)
要将一个Char转换成为一个数值(比如Int32),最简单的方法就是转型。在三种技术中,效率也是最高的,因为编译器会生成中间语言(IL)指令来执行转型,不必调用任何方法。此外,有的语言(比如c#)允许指定转换时使用checked还是unchecked代码。
2) 使用Convert类型
System.Convert类型提供了几个静态方法来实现Char和数值类型的相互转型。所以这些方法都是以checked方式进行转换,所以一旦发现转型会造成数据丢失,就会抛出OverflowException异常。
3) 使用IConvertible接口
Char类型和FCL的所有数值类型都实现的ICOnvertible接口。该接口定义了像ToUInt16和ToChar这些的方法。这种技术效率最差,因为在值类型上调用一个接口方法,要求对实例进行装箱—— Char和所有数值类型都是值类型。如果某个类型不能转换,或者转换造成数据的丢失,IConvertible的方法会抛出System.InvalidCastException异常。
下面演示这三种方法的调用:
public static void Main() { Char c; Int32 n; // 使用C#转型技术实现,强制类型转换 c = (Char)65; Console.WriteLine(c); // 显示 "A" n = (Int32)c; Console.WriteLine(n); // 显示 "65" c = unchecked((Char)(65536 + 65)); Console.WriteLine(c); // 显示 "A" // 使用Convert进行转换 c = Convert.ToChar(65); Console.WriteLine(c); // 显示 "A" n = Convert.ToInt32(c); Console.WriteLine(n); // Displays "65" // 显示Convert的范围检查 try { c = Convert.ToChar(70000); // 对 16-bits 来说过大 Console.WriteLine(c); // 不知心 } catch (OverflowException) { Console.WriteLine("Can't convert 70000 to a Char."); } // 使用IConvertible进行转换 c = ((IConvertible)65).ToChar(null); Console.WriteLine(c); // 显示 "A" n = ((IConvertible)c).ToInt32(null); Console.WriteLine(n); // 显示 "65" }
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/44011.html