1、基础

  • 枚举类型(enumerated types)定义了一组“符号名称/值”配对。
  • 枚举类型是值类型,每个枚举类型都是从System.Enum派生的,而System.Enum又是从System.ValueType派生,而其后又是从System.Object派生而来
  • 枚举类型没有方法属性和事件,但是可以通过扩展方法进行模拟向枚举类型添加方法。

2、例子与IL分析

   对于以下的一个枚举类型,通过IL可以知道其内部的结构如下图(1-1)所示:

  public enum Color{
White,
Red,
Green,
Blue,
Orange
}

  通过IL代码可知,对于Blue,Green等其内部实现是常量int32的类型,该枚举类型继承与System.Enum类。C#编译器将枚举类型视为基元类型,所以可以用许多操作符(==,!=,<,>,<=,>=,+,-,^,&,|,~,++和--来操作没绝类型的实例,这些操作符实际上作用于每个枚举类型实例内部的value__实例字段。

3、对于System.Enum下的常用静态方法

 
编号 名称 说明
 1 GetName 在指定枚举中检索具有指定值的常数的名称。
 2 GetNames 检索指定枚举中常数名称的数组。
 3 GetUnderlyingType 返回指定枚举的基础类型。
 4 GetValues 检索指定枚举中常数值的数组。
 5 IsDefined 返回指定枚举中是否存在具有指定值的常数的指示。
 6 Parse(Type, String) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
 7 Parse(Type, String, Boolean) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写。
 8 TryParse<TEnum>(String, TEnum) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值。
 9 TryParse<TEnum>(String, Boolean, TEnum) 将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否区分大小写。 用于指示转换是否成功的返回值。

4、位标志(FlagsAttribute特性)

枚举类型表示单个数值,而位标志表示一组位,其中有些位处于on状态,有些位处于off状态。【二进制中1代表on,0代表off】,对于位标志的枚举实例输出内部会直接ToString输出,将会直接格式化与名字枚举名称相对应的字符串并且中间用逗号隔开。具体的代码如下所示,其生成后的结果如图1-2
using System;
public class temp
{
public static void Main(){
var color=Color.Green | Color.Red;
Console.WriteLine(color);
}
}
[Flags]
public enum Color{
White=,
Red=,
Green=,
Blue=,
Orange=
}
 
    

【CLR Via C#】15 枚举类型与位类型的更多相关文章

  1. [CLR via C#]15. 枚举类型和位标志

    一.枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对. 例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal en ...

  2. 重温CLR(十一) 枚举类型、位标志和数组

    枚举类型 枚举类型(enumerated types)定义了一组"符号名称/值"配对.例如,以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum ...

  3. 【C#进阶系列】15 枚举类型和位标志

    实际上本章就只讲枚举类型,因为位标志本来就可以当做一个特殊的枚举类型. 关于枚举类型 枚举类型是一种消灭魔法数字的好方法,使程序更容易编写,阅读和维护. 枚举类型是值类型,然而有别于其它值类型,枚举类 ...

  4. 《CLR via C#》---枚举标志和标志位

    枚举类型 枚举类型定义了一组符号名称/值配对. 如 private enum Color /* : byte */ { White, // Assigned a value of 0 Red, // ...

  5. 异常跟踪之CLR 类型到 EDM 类型的映射不明确

    异常信息: "指定的架构无效.错误: CLR 类型到 EDM 类型的映射不明确,因为多个 CLR 类型与 EDM 类型“Person”匹配. 以前找到的是 CLR 类型“A.Person”, ...

  6. [CLR via C#]5.2 引用类型和值类型

    原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...

  7. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...

  8. [Clr via C#读书笔记]Cp5基元类型引用类型值类型

    Cp5基元类型引用类型值类型 基元类型 编译器直接支持的类型,基元类型直接映射到FCL中存在的类型. 作者希望使用FCL类型名称而避免使用关键字.他的理由是为了更加的清晰的知道自己写的类型是哪种.但是 ...

  9. 指定的架构无效。错误: CLR 类型到 EDM 类型的映射不明确

    在使用WebService开发时,同时使用了EF和linq,查询数据时,使用linq(查询订单)可以正常拉出数据, 但是使用EF(查询用户)却会报以下错误: {"指定的架构无效.错误: \r ...

随机推荐

  1. Mahout使用(一)

    1.HelloMahout.java2.DistanceTest.java3.MahoutDemo.java 1.HelloMahout.java package cn.crxy.mahout; im ...

  2. 搭建Golang开发环境

    Go语言是谷歌 2009 年首次推出并在 2012 年正式发布的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 ...

  3. 如何用Python来处理数据表的长宽转换(图文详解)

    不多说,直接上干货! 很多地方都需用到这个知识点,比如Tableau里.   通常可以采取如python 和 r来作为数据处理的前期. Tableau学习系列之Tableau如何通过数据透视表方式读取 ...

  4. 删除qq互联

    1.删除source/plugin 下的文件qqconnect文件夹 2.删除数据: DELETE FROM `dn_common_plugin` WHERE `identifier` = 'qqco ...

  5. C#基础篇四数组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace P01A ...

  6. CentOS 6.5 网络服务器功能的实现①:运用bind搭建基本的DNS服务器

    何谓DNS服务?简而言之,DNS服务在互联网中可以实现域名解析(把域名转换成网络可以识别的IP地址). 名词解释①:正向解析:域名解析IP地址:反向解析:IP地址解析域名. DNS服务的正/反向区域解 ...

  7. Java多线程同步集合--并发库高级应用

    一.阻塞队列1.在多线程领域,所谓阻塞,在某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒2.ArrayBlockingQueue(效率高)和LinkedBlockingQueue是两个 ...

  8. Bean Validation规范

    以下内容转载自:https://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/ Bean Validation规范介绍 JSR303 规范(Bea ...

  9. Cglib invoke以及invokeSuper的一点区别

    简单记录下,解决的一个问题,Cglib的invoke和invokeSuper的区别: 简而言之,invoke方法调用的对象没有增强过,invokeSuper方法调用的对象已经是增强了的,所以会再走一遍 ...

  10. list双向链表容器(常用的方法总结)

    特别注意,由于list对象的结点并不要求在一段连续的内存中,所以,对于迭代器,只能通过++或者--的操作将迭代器移动到后继或者前驱结点元素处.而不能对迭代器进行+n或者-n的操作,这点与vector等 ...