C# 枚举的使用简介

枚举这个名词大家都听过,很多小伙伴也使用过,

那么枚举在开发中能做什么,使用它后能给程序代码带来什么改变,为什么用枚举。

各位看官且坐下,听我一一道来。

为什么使用枚举?

1、枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值。

2、枚举使代码更易于维护,有助于确保给变量指定合法的、期望的值。

3、枚举使代码更易输入和读取。

枚举有哪些用法?

1、简单枚举

2、标志枚举

1、简单枚举

  • 枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal。
  • 枚举是值类型,隐式继承自System.Enum,不能手动修改。System.Enum本身是引用类型,继承自System.ValueType。
  • 枚举都是隐式密封的,不允许作为基类派生子类。
  • 枚举类型的枚举成员均为静态,且默认为Int32类型。
  • 每个枚举成员均具有相关联的常数值。此值的类型就是枚举的底层数据类型。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内。如果没有明确指定底层数据类型则默认的数据类型是int类型。
  • 枚举成员不能相同,但枚举的值可以相同。
  • 枚举最后一个成员的逗号和大括号后面的分号可以省略

  C#提供类一个类来方便操作枚举,下面给出这个类的常用方法:

C#枚举常用方法

方法 名称
CompareTo 将此实例与指定对象进行比较并返回一个对二者的相对值的指示
Equals 指示此实例是否等于指定的对象
Format 根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式
GetName 在指定枚举中检索具有指定值的常数的名称
GetNames 检索指定枚举中常数名称的数组
GetNames 检索指定枚举中常数名称的数组
GetTypeCode 返回此实例的基础 TypeCode
GetUnderlyingType 返回指定枚举的基础类型
GetValues 索指定枚举中常数值的数组
HasFlag 确定当前实例中是否设置了一个或多个位域
IsDefined 返回指定枚举中是否存在具有指定值的常数的指示
Parse
将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 一个参数指定该操作是否不区分大小写

TryParse
将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。 用于指示转换是否成功的返回值

如果要显示指定枚举的底层数据类型很简单,只需在声明枚举的时候加个冒号,后面紧跟要指定的数据类型(可指定类型有:byte、sbyte、short、ushort、int、uint、long、ulong)。

显式设置枚举的成员常量值,默认是从0开始,逐个递增的。但是以下例子却设置成了1,2,3,0。而且成员值可以一样的。

如下示例:由枚举值获取枚举名称与由枚举名称获取枚举值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace enumApplication
{
 class Program
 {
 static void Main(string[] args)
 {
  //输出方式一:
  Console.WriteLine("我是四大名著之一的:" + Enum.GetName(typeof(Man), 1)); //西游记(是哪个名著由值获取)

  //输出方式二:
  string[] array1 = Enum.GetNames(typeof(Man));
  Console.WriteLine("我是四大名著之一的:" + array1[2]); //红楼梦(是哪个名著由值获取)

  //输出方式三:
  Array array2 = Enum.GetValues(typeof(Man));
  Console.WriteLine("我是四大名著之一的:" + array2.GetValue(3)); //三国演义(是哪个名著由值获取)

  //输出方式四:
  Type t = Enum.GetUnderlyingType(typeof(Man));
  Console.WriteLine("我输出的是值类型:"+t); //输出 Int32

  //输出方式五:由值获取内容
  int i = 0;
  string Name = Enum.Parse(typeof(Man), i.ToString()).ToString(); //此时 Name="水浒传"
  Console.WriteLine("我是四大名著之一的:" + Name);

  //输出方式六:由值获取内容
  string Name2 = "红楼梦";
  int j = Convert.ToInt32(Enum.Parse(typeof(Man), Name2)); //此时 j=2
  Console.WriteLine("我是《红楼梦》对应的值序号:"+j);

  Console.ReadKey();
 }
 enum Man:int //四大名著枚举
 {
  西游记 = 1,
  红楼梦 = 2,
  三国演义 = 3,
  水浒传 = 0
 }
 }
}

2、标志枚举

标志枚举要在顶部加[System.Flags]特性进行声明。而且枚举支持组合运算。

这种位运算是非常有用的,在sql语句里也支持位运算。也就是说,把一个枚举运算后的结果存入数据库之后,还能够按照你的要求读取出来。比如:

将一个"高帅"存如数据库的值存入数据库,那么存入去的就是整型5。

select * from Table where Column & 1 = 1  //Column 是列名

select * from Table1 where Column  | 1 = Column 

如下demo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace enumApplication
{
 class Program
 {
 static void Main(string[] args)
 {
  var man = People.高 | People.帅; //赋值为101 计算方法001或上100,结果是101
  Console.WriteLine("高和帅的枚举值和为:"+(int)man);
  if ((man & People.高) == People.高) //101 man
  {     //001 高 逐位相与,
  Console.WriteLine("此人:高"); //001 如果结果是高,就可以反推出man包含 高
  }
  else
  {
  Console.WriteLine("此人:矮");
  }
  Console.ReadKey();
 }

 [System.Flags]
 public enum People:int
 {
  高 = 1, //001
  富 = 2, //010
  帅 = 4, //100
 }
 }
}

3、枚举使用的一些建议

  • 作为参数、返回值、变量等类型可以使枚举,尽量使用枚举(要注意考虑分类的稳定性)
  • 大多数情况下都可以使用int类型枚举,下列情况除外。
  • 枚举可能被大量频繁的使用,这时为了节约空间可以使用小于int类型的枚举。
  • 标志枚举,且标志多于32个。

枚举用好了还是蛮方便的,大家不妨去试试。

以上就是C# 枚举的使用简介的详细内容,更多关于C# 枚举的资料请关注我们其它相关文章!

(0)

相关推荐

  • 简述C#枚举高级战术

    文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开发时需要用枚举表示,且一个用户可能会拥有多个角色. 映入你脑海的第一个答案可能是:varchar 类型,用分隔符的方式来存储多个角色,比如用 1|2|3 或 1,2,3 来表示用户拥有多个角色.当然如果角色数量可能超过个位数,考虑到数据库的查询方便(比如用 INSTR 或 POSITION

  • C# 实现枚举转列表

    今天有朋友问我,ComboBox 怎么绑定一个 Enum,其实他的意思是枚举如何转换为列表.想想这确实是一个挺正常的需求,但我一时也只想到遍历,他觉得麻烦,于是我在网上帮忙查了一下,提取了三个方法,后来在常用代码工具库也看到一个方法,所以总共四个方法,分为两组,功能可以说都是一样的,就是形式不同,现在分享给大家. #region 获取枚举列表 /// <summary> /// 通过枚举对象获取枚举列表 /// </summary> /// <typeparam name=&

  • 详细了解C# 枚举与位枚举

    一.枚举的概念: C# 枚举(Enum), 枚举类型是用于声明一组命名的常数的基本数据类型(值类型): 二.枚举的定义: 声明enum变量: enum <enum_name> {enumeration list}; 其中enum_name 指定枚举的类型名称:  enumeration list 是一个用逗号分隔的标识符列表: 枚举列表中的每个符号代表一个整数值,一个比他前面的符号大的整数值.默认情况下,第一个枚举符号的值是0.例如: enum Days {Sun , Mon, tue, Fi

  • C#如何获取枚举的描述属性详解

    前言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时在使用枚举类型时,我们需要取名称和值,甚至有时候还需要取枚举类型的描述.通过反射,我们能获取到枚举类型的描述属性. 首先我们需要给枚举类型添加描述属性(属性都没有是不可能取到的),[Description]就是描述属性,使用这个属性,我们需要添加 using System.ComponentModel 引用. public enum EnumSex { /// <summary> /// 男 /// </summary>

  • 细说C#中的枚举:转换、标志和属性

    枚举是 C# 中最有意思的一部分,大部分开发人员只了解其中的一小部分,甚至网上绝大多数的教程也只讲解了枚举的一部分.那么,我将通过这篇文章向大家具体讲解一下枚举的知识.我将从大家都了解的部分开始讲解,然后再讲解大家所不知道的或者了解很少的部分. 零.基础知识 枚举是由开发人员声明的一种 值类型 ,它在编译时就声明了一种 具名常量值 .使用枚举可以使我们的代码简单易读,我们先来看一下两个代码段: // 代码段 1 void Method(int country) { switch (country

  • C#从foreach语句中枚举元素看数组详解

    前言 在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数.如图显示了调用foreach方法的客户端和集合之间的关系.数组或集合实现带GetEnumerator()方法的IEnumerable接口.GetEnumerator()方法返回一个实现lEnumerable接口的枚举,接着foreach语句就可以使用IEnumerable接口迭代集合了. GetEnumerator()方法用IEnumerable接口定义,foreach语句并不真的需要在集合类中实现这

  • 详解C#枚举高级战术

    文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开发时需要用枚举表示,且一个用户可能会拥有多个角色. 映入你脑海的第一个答案可能是:varchar 类型,用分隔符的方式来存储多个角色,比如用 1|2|3 或 1,2,3 来表示用户拥有多个角色.当然如果角色数量可能超过个位数,考虑到数据库的查询方便(比如用 INSTR 或 POSITION

  • 快速学习c# 枚举

    一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 (1)枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和internal. (2)枚举是值类型,隐式继承自System.Enum,不能手动修改.System.Enum本身是引用类

  • C#中如何为枚举类型添加描述方法【小技巧】

    背景 在我们的日常开发中,我们会经常使用枚举类型.枚举类型(enum type)是具有一组命名常量的独特的值类型.在以下示例中: enum Color { Red, Green, Blue } 声明一个名为 Color 的枚举类型,该类型具有三个成员:Red.Green 和 Blue. 枚举具体是怎么声明呢?枚举声明用于声明新的枚举类型.枚举声明以关键字 enum 开始,然后定义该枚举类型的名称.可访问性.基础类型和成员.具体格式: 修饰词(new.public.protected.intern

  • C#中变量、常量、枚举、预处理器指令知多少

    一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { private static uint variableUInt; public static uint VariableUInt { get => variableUInt; set => variableUInt = value; } string VariableStr; public Var

  • C#如何利用反射将枚举绑定到下拉框详解

    前言: 反射(Reflection)是.NET提供给开发者的一个强大工具,尽管作为.NET框架的使用者,很多时候不会用到反射.但在一些情况下,尤其是在开发一些基础框架或公共类库时,使用反射会使系统架构更加灵活. 在开发中,我们常常会遇到比如有些状态值在定义好后几乎从不改动,这时候使用数据库就显得有些多余了.首先想到的一个办法可能是在程序中创建一个数组来表示,此时,我们遇到了使用数组可能带来的第一个问题:不方便使用.当数组结构变更时,可能意味着所有使用过此数组的地方的索引都发生了变更,这是我们不想

随机推荐