2025年重温CLR(十) 字符、字符串和文本处理

重温CLR(十) 字符、字符串和文本处理本章将介绍 net 中处理字符和字符串的机制 字符 在 NET Framewole 中 字符总是表示成 16 位 Unicode 代码值 这简化了国际化应用程序的开发 每个字符都表示成 System Char 结构 一个值类型 的一个实例 System Char 类型提供了两个公共只读常量字段 MinValue 定义成

大家好,我是讯享网,很高兴认识大家。

本章将介绍.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" }

讯享网
小讯
上一篇 2025-04-07 08:19
下一篇 2025-02-11 22:34

相关推荐

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