[学习与积累] CLR via C#(第三版)——基本类型(字符)

在.net framework中,字符总是表示成16位的unicode的代码值,每个字符都表示成System.Char结构的一个实例,而采用国际通用的unicode字符,正好可以适用国际的环境。

System.char类型非常简单,它提供了两个公共的只读常量字段:

                    MInValue(定义成'\0')  MaxValue(定义成'\uffff')

 

针对char的一实例,可以调用静态的GetUnicodeCategory方法,这个方法返回的是system.Globalization.UnicodeCategory枚举类型的一个值,该值指示该字符是控制字符,货币符号,小写字母,大写字母还是标点符号,数学符号,也或是其他字符。

 

为了简化开发,char类型还提供了几个静态的方法,比如IsDigit, IsLetter, IsUpper, Islower, IsPunctuation, IsLetterOrDigit, IsControl, IsNumber, IsSeparate, IsSurrogate, IsLowSurrogate,I sHighSurrgate 和 IsSymbol 等,其中大多数方法都在内部调用了GetUnicodeCategory方法,并简单返回true和false

 

另外,可调用静态方法ToLowerInvariant或者ToUpperInvariant,以一种忽略文化(Culture)的方式将一个字符转换为小写或者写形式。作为一种替代方案,也可使用ToLower和ToUpper方法转换为大写或者小写的形式,但这两个方法调用时要使用与调用线程关联的语言文化信息。之所以需要这种文化信息,是因为大小写转换是一种依赖于文化的一种操作。

其他方法:Equals方法会在两个Char实例 代表同一个人6位Unicode码位的前提下返回true,

     CompareTo方法返回两个实例互略语言文化特性的比较结果。

     ComvertFromUtf32方法获取一个UTF_32字符,并返回一个或者两个UTF_16字符构成的字符串

     ComvertToUtf32方法获取一对低/高代理项字符,或者获取一个字符串,并返回一个UTF码位(int32值)

     ToString方法返回由单个字符构成的的一个String。 

最后一个是GetNumberValue,它返回字符的数值形式。以下给出示例

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char c='a';
            Console.WriteLine(Char.IsDigit(c));//显示false
            Console.WriteLine(Char.IsLetter(c));//显示true
            Console.WriteLine(Char.IsControl(c));//显示false
            Console.WriteLine(Char.IsHighSurrogate(c));//显示false
            Console.WriteLine(Char.IsLetterOrDigit(c));//显示true
            Console.WriteLine(Char.IsLower(c));//显示true
            Console.WriteLine(Char.IsPunctuation(c));//显示false
            Console.WriteLine(Char.IsSeparator(c));//显示false
            Console.WriteLine(Char.IsSymbol(c));//显示false
            Console.WriteLine(Char.GetUnicodeCategory(c));//显示lowcaseLetter
            Console.WriteLine(Char.ToUpperInvariant(c));//显示A
            Console.WriteLine(Char.ToUpper(c));//显示A
            double d;      //'\u0033'是数字3
            d = Char.GetNumericValue('\u0033');
            Console.WriteLine(d.ToString());//显示3
            //'\u00bc'是普通数据四分之一
            d=Char.GetNumericValue('\u00bc');
            Console.WriteLine(d.ToString());//显示0.25
            //'A' 是大写拉丁字母A
            d = Char.GetNumericValue('A');
            Console.WriteLine(d.ToString());//显示-1
            Console.Read();
        }
    }
}

 

 可以使用三种技术实现各种数值类型与Char实例之间的相互转换。下面按照优先顺序列出这些技术

  • 转型(强制类型转换)

    需要一个char转换成一个数值(比如int32)最简单的办法就是转型。在三种技术中这种转型效率最高,不必调用任何方法,编译器会自动生成中间指令来执行转换。此外,C#中还可使用checked和unchecked代码。

  • 使用Convert类型

    System.Convert类提供了几个静态方法来实现char和数值类型之间的相互转换。所有这些方法都以checked方式来执行转换,所以一旦发现转换会造成数据的丢失,就会抛出OverflowExcetion异常。

  • 使用IConvertible接口

    char类型和FCL中所有数值类型都实现了IConvertible接口。该接口定义了像ToInt16和ToChar这样的方法。这种接口效率最差,因为值类型上调用一个接口要对一个实例进行装箱。如果某个数值类型不能转换(比如将char转换成boolean值)或者转换造成数据丢失,IConvertible的方法会抛出一个System.InvalidCastExcetion异常。注意:许多类型(包括FCL的char和数值类型)都将IConvertible方法实现为显式接口成员,也就是使用前必须将实例显式转换为一个IConvertible。

以下代码演示了如何使用这三种技术

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char c;
            Int32 n;
            //使用C#技术实现数字与字符的相互转换
            c = (char)65;
            Console.WriteLine(c);//显示'A'

            n = (int)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);//显示'65'

            try
            {
                 c = Convert.ToChar(70000);//对16位数来说数字太大
                Console.WriteLine(c);//显示不执行
            }
            catch(OverflowException )
            {
                Console.WriteLine("con't convert 70000 to a char");
            }

            //使用IConvertible实现数字与字符的相互转换
            c = ((IConvertible)65).ToChar(null);//该转换对象实现了IformatProvider接口,转换时需要考虑语言文化信息,但是大多数可以互略语言文化,为这个参数传递null值
            Console.WriteLine(c);//显示'A'

            n = ((IConvertible)c).ToInt32(null);//该转换对象实现了IformatProvider接口,转换时需要考虑语言文化信息,但是大多数可以互略语言文化,为这个参数传递null值
            Console.WriteLine(n);//显示'65'

            Console.Read();
        }
    }
}

 

posted @ 2012-06-26 14:20  thickThinker  阅读(361)  评论(0编辑  收藏  举报