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

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

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


为什么使用枚举?

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), )); //西游记(是哪个名著由值获取) //输出方式二:
string[] array1 = Enum.GetNames(typeof(Man));
Console.WriteLine("我是四大名著之一的:" + array1[]); //红楼梦(是哪个名著由值获取) //输出方式三:
Array array2 = Enum.GetValues(typeof(Man));
Console.WriteLine("我是四大名著之一的:" + array2.GetValue()); //三国演义(是哪个名著由值获取) //输出方式四:
Type t = Enum.GetUnderlyingType(typeof(Man));
Console.WriteLine("我输出的是值类型:"+t); //输出 Int32 //输出方式五:由值获取内容
int i = ;
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 //四大名著枚举
{
西游记 = ,
红楼梦 = ,
三国演义 = ,
水浒传 =
}
}
}

2、标志枚举

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

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

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

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

select * from Table1 where  Column  |  = 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
{
高 = , //
富 = , //
帅 = , //
}
}
}

3、枚举使用的一些建议

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

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

C#枚举的简单使用的更多相关文章

  1. C语言第十讲,枚举类型简单说明

    C语言第十讲,枚举类型简单说明 一丶C语言中的枚举类型(ENUM) 在我们实际工作中,或者编写代码中.我们有的时候会用固定的值.而且不是很多. 这个时候就可以使用枚举了.如果我们使用#define显然 ...

  2. Java Enum 枚举的简单使用

    一.什么是枚举 值类型的一种特殊形式,它从 System.Enum 继承,并为基础基元类型的值提供备用名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个内置的有符号(或无符号)整数类型(如 ...

  3. java 枚举的简单应用。

    枚举,就是保存着原始的<key,value> 在代码中会经常用到.为了不坑自己,记录一下笔记 package com.fortunedr.common.constant; public e ...

  4. Java中枚举类型简单学习

    /* * enum类型不允许继承 * 除了这一点,我们基本上可以将enum看作一个常规的类 * 我们可以添加自己的方法与属性,我们也可以覆盖其中的方法. * 不过一定要在enum实例序列的最后添加分号 ...

  5. <java>枚举的简单介绍

    1.枚举,enum关键字,相当于public final static. 2.举例: 首先定义了一个名为spiciness的枚举类型. public enum Spiciness { NOT, MIL ...

  6. java 枚举类(简单使用)

    直接上代码 用法一(常量): package com.ou.test; import com.sun.corba.se.impl.util.SUNVMCID; public class Enum { ...

  7. c#编程基础之枚举

    枚举的意义就在于限制变量取值范围. 当可以确定的几种取值时才可以用. 如果输入一个字符串需要进行判断是否是我们需要的字符串时,则一般需要这样写: using System; using System. ...

  8. 想让你的java代码更漂亮,用枚举吧

    枚举是java 5之后添加的一个重要特性,这个特性不能提高性能,但是能让java程序员写出更优雅的代码. 我之前看到过挺多介绍java枚举的不错的帖子,我也来参与以下这个话题. 1. 枚举基本用法 / ...

  9. JAVA中的枚举小结

    枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...

随机推荐

  1. .net中的线程同步基础(搬运自CLR via C#)

    线程安全 此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的.但不保证任何实例成员是线程安全的. 在MSDN上经常会看到这样一句话.表示如果程序中有n个 ...

  2. Django 基础一(安装和启动)

    在开始跟着本文学习Django进行Web开发之前你需要有一定的python编程基础,会用一些简单的Linux系统命令.如果你对python一无所知,请先去这个网站学习一下python编程的基础 Lin ...

  3. Python并发编程之初识异步IO框架:asyncio 上篇(九)

    大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...

  4. Bug的严重等级和优先级别与分类

    一. Bug的严重等级定义: 1. Blocker 即系统无法执行.崩溃或严重资源不足.应用模块无法启动或异常退出.无法测试.造成系统不稳定. 严重花屏 内存泄漏 用户数据丢失或破坏 系统崩溃/死机/ ...

  5. Linux上删除大量文件几种方式对比

    目录 Linux上删除大量文件几种方式对比 1. rm删除:因为文件数量太多,rm无法删除(报错) 2. find查找删除:-exec 3. find查找删除:xargs 4. find调用-dele ...

  6. Redis in .NET Core 入门:(4) LIST和SET

    第1篇:https://www.cnblogs.com/cgzl/p/10294175.html 第2篇 String:https://www.cnblogs.com/cgzl/p/10297565. ...

  7. Docker 配置国内镜像加速器,加速下载速度

    文章首发自个人微信公众号:小哈学Java 个人网站地址:https://www.exception.site/docker/docker-configuration-of-mirror-acceler ...

  8. 【极简版】SpringBoot+SpringData JPA 管理系统

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在上一篇中已经讲解了如何从零搭建一个SpringBo ...

  9. 理解ScheduledExecutorService中scheduleAtFixedRate和scheduleWithFixedDelay的区别

    scheduleAtFixedRate 每间隔一段时间执行,分为两种情况: 当前任务执行时间小于间隔时间,每次到点即执行: /** * 任务执行时间(8s)小于间隔时间(10s) */ public ...

  10. JavaSE:数据类型之间的转换(附常见面试题)

    数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...