现在的位置: 首页 > 综合 > 正文

Microsoft.Net框架程序设计学习笔记(19):枚举类型与位标记

2012年07月21日 ⁄ 综合 ⁄ 共 1765字 ⁄ 字号 评论关闭

枚举类型

  当编译一个枚举类型时,C#编译器会将其中的每个符号转变为类型的一个常数字段。

  枚举类型就是一个定义了一组常数字段的结构而已。这些字段编译后会被存放在生成模块的元数据中,且可以通过反射来访问。

  Enum的静态方法:static Type Enum.GetUnderLyingType(Type enumType)。该方法返回用于保存枚举类型实例值的基础类型。每个枚举类型都有一个基础类型,它们可以是byte、sbyte、short、ushort、int(C#选用的默认值)、uint、long或ulong。

  我们可以在定义一个枚举类型的时候,让其中多个符号有着相同的数值。但当将一个数值转换为枚举类型符号时,Enum的方法只返回其中的一个符号,具体返回哪个并不确定。另外,如果不存在与传入的数值对应的符号,方法将返回一个包含数值的字符串。

  Enum的静态方法static Array GetValues(Type enumType)允许我们获取一个枚举类型中定义的所有符号。示例:

  public enum Color
  {
    Red,
    Green,
    Blue,
  }
  Color[] colors = (Color[])Enum.GetValues(typeof(Color));

  Enum还提供了下面两个静态方法返回一个枚举类型的符号:

  //返回数值的字符串表达形式
  public static String GetName(Type enumType, Object value);
  //返回一个字符串数组:枚举类型中的每个符号对应一个数组元素
  public static String[] GetNames(Type enumType);

  将一个文本符号转换为一个枚举类型的实例:

  public static Object Parse(Type enumType, String Value, Boolean ignoreCase);

  使用示例:

  //创建一个Color.Red枚举实例
  Color c = (Color)Enum.Parse(typeof(Color), "red", true);
  //创建一个值为0的Color枚举实例
  Color c = (Color)Enum.Parse(typeof(Color), "0", false);

  利用Enum的静态方法static bool IsDefined(Type enumType, String Value)可以判定一个数值对于某个枚举类型是否合法,示例:

  //以下两行代码返回true
  Enum.IsDefine(typeof(Color), 1);
  Enum.IsDefine(typeof(Color), "Red");

  枚举类型应该嵌套定义在需要它的类型中?还是将枚举类型与需要它的类型定义在同一层次上?在FCL中,枚举类型通常和需要它的类型定义在同一层次上。这样可以减轻开发人员的代码录入工作。所以,我们也应该将枚举类型和需要它的类型定义在同一层次上。

位标识

  当定义用于标识位标记的枚举类型时,我们应该显式为每一个符号赋予映射到每个位的数值。同时,应该在枚举类型上应用System.FlagsAttribute定制特性。

  示例:

  [Flags]
  enum Actions
  {
    Read = 0x0001,
    Write = 0x0002,
    Delete = 0x0004,
    Query = 0x0008,
    Sync = 0x0010
  }
  Actions actions = Actions.Read | Actions.Write;  //0x0003
  Console.WriteLine(actions.ToString());      // "Read, Write"
  Actions a = (Actions)Enum.Parse(typeof(Actions), "Query,Read", false);  //a = Actions.Query | Actions.Read = 9
  Actions a = (Actions)Enum.Parse(typeof(Actions), "9", false);  //a = Actions.Query | Actions.Read = 9

抱歉!评论已关闭.