前言

该系列继续更新,枚举介绍。

正文

首先呢,枚举是值类型,这个没什么好说的。

enum ConnectionState
{
DisConnected,
Connecting,
Connected,
DisConnecting
}

如果不显示命名的情况下呢?第一个DisConnected为0,Connecting 为1。

enum ConnectionState
{
DisConnected,
Connecting=100,
Connected,
DisConnecting
}

如果Connecting 被设置为100了,那么connected 就是101,DisConnecting 就是102。

枚举支持不同类型之间的枚举转换,但是两种的值要相等。

但是数组并不能直接转换:

先转换成array,然后再转换成ConnectionState2 是可以的:

数字转枚举,一般就是之间显示转换就可以了。

即使这个值不存在,转换也不会存在问题:

这个时候a.tostring()就是100,不然的话就会输出我们定义的字符串了。

那么如果将字符串转换为枚举呢?

internal class Program
{
static void Main(string[] args)
{
if (Enum.TryParse<ConnectionState>("DisConnected", out ConnectionState value))
{
Console.WriteLine(value.ToString());
}
Console.ReadKey();
}
}

如果用parse,那么如果字符串没有和枚举匹配的那么会报错。

然后枚举还有一个比较好的功能那就是可以多选。

这种情况就是枚举作为标志位使用。

其实原理很简单,利用的是二进制这个设计。

比如:

000000000000000001

000000000000000010

那么他们相加之后就是:000000000000000011

这个只要知道哪一个位数上有,那么哪个就被选中了。

官方使用比较多的例子是system.io 中:

[Flags]
public enum FileAttributes
{
ReadOnly = 0x0001,
Hidden = 0x0002,
System = 0x0004,
Directory = 0x0010,
Archive = 0x0020,
Device = 0x0040,
Normal = 0x0080,
Temporary = 0x0100,
SparseFile = 0x0200,
ReparsePoint = 0x0400,
Compressed = 0x0800,
Offline = 0x1000,
NotContentIndexed = 0x2000,
Encrypted = 0x4000,
IntegrityStream = 0x8000,
NoScrubData = 0x20000
}

这里面就有很多组合,比如ReadOnly 和Hidde 等等,这里就不举例了。

static void Main(string[] args)
{
FileInfo fileInfo = new FileInfo("c:/test.txt");
fileInfo.Attributes = FileAttributes.Hidden| FileAttributes.ReadOnly;
Console.ReadKey();
}

上面就是说明将这个文件信息设置为隐藏且只读的吧。| 符合为:如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。

当然,如果有一些组合你已经知道了,那么你可以在枚举中就处理:

[Flags]
enum MyEnum
{
high = 1,
rich = 2,
graceful = 4,
hrq = high | rich | graceful
}

然后很多人建议在flags 中都有一个none 为0的枚举,表示一个都没有选:

[Flags]
enum MyEnum
{
none = 0,
high = 1,
rich = 2,
graceful = 4,
hrq = high | rich | graceful
}

然后这里解释一下,我们为什么要使用Flags。

我们知道原理后,其实不使用flags也是可以实现的。

enum MyEnum
{
none = 0,
high = 1,
rich = 2,
graceful = 4,
hrq = high | rich | graceful
}

那么这个flags 给我们带来了什么呢?

static void Main(string[] args)
{
var test = MyEnum.high | MyEnum.rich;
Console.WriteLine(test.ToString());
}

当我们tostring的时候:

给我们返回了high, rich,如果没有这个flags的话,那么返回的是3。

那么可以string 用逗号可以转换为,如果没有flags,那么就转换不了:

因为enum 根据enum 走的是不同的方法:

private static string? InternalFormat(RuntimeType enumType, ulong value)
{
EnumInfo enumInfo = GetEnumInfo(enumType); if (!enumInfo.HasFlagsAttribute)
{
return GetEnumName(enumInfo, value);
}
else // These are flags OR'ed together (We treat everything as unsigned types)
{
return InternalFlagsFormat(enumType, enumInfo, value);
}
}

该系列继续更新。

重学c#系列——枚举[二十三]的更多相关文章

  1. .net基础学java系列(二)IDE 之 插件

    上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...

  2. 重学c#系列——字典(十一)

    前言 重学c#系列继续更新,简单看一下字典的源码. 看源码主要是解释一下江湖中的两个传言: 字典foreach 顺序是字典添加的顺序 字典删除元素后,字典顺序将会改变 正文 那么就从实例化开始看起,这 ...

  3. 三叔学FPGA系列之二:Cyclone V中的POR、配置、初始化,以及复位

    对于FPGA内部的复位,之前一直比较迷,这两天仔细研究官方数据手册,解开了心中的诸多疑惑,感觉自己又进步了呢..... 原创不易,转载请转原文,注明出处,谢谢.   一.关于POR(Power-On ...

  4. 重学c#系列——对c#粗浅的认识(一)

    前言 什么是c#呢? 首先你是如何读c#的呢?c sharp?或者c 井? 官方读法是:see sharp. 有没有发现开发多年,然后感觉名字不对. tip:为个人重新整理,如学习还是看官网,c# 文 ...

  5. Liferay 6.2 改造系列之二十三:修改Liferay原始主题中"技术支持:Liferay"字样

    1.修改主题模板文件,具体位置如下 (1) portal-master\portal-web\docroot\html\themes\_unstyled\templates\portal_normal ...

  6. 《sed的流艺术之三》-linux命令五分钟系列之二十三

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  7. .net基础学java系列(二)IDE

    上一篇文章.net基础学java系列(一)视野 废话: "视野"这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的! 有.net ...

  8. 重学c#系列——datetime 和 datetimeoffset[二十一]

    前言 简单介绍一下datetime和 datetimeoffset. 正文 了解一个国家的文化,就要了解一个国家的历史. 要了解datetimeoffset,那么很有必要了解一下datetime. 表 ...

  9. 重学c#系列——list(十二)

    前言 简单介绍一下list. 正文 这里以list为介绍. private static readonly T[] s_emptyArray = new T[0]; public List() { t ...

  10. 重学c#系列——c#运行原理(二)

    前言 c# 是怎么运行的呢?是否和java一样运行在像jvm的虚拟机上呢?其实差不多,但是更广泛. c# 运行环境不仅c#可以运行,符合.net framework 开发规范的都可以运行. c# 程序 ...

随机推荐

  1. Toast 部分记录丢失问题处理

    在日常数据库运维过程中,我们可能会遇到类似以下的错误.该错误信息是由于部分tuple的 toast 字段丢失,导致数据无法访问.需要通过游标方式,将可以访问的数据备份出来. test=# create ...

  2. EntityFrameworkCore 模型自动更新(上)

    话题 嗯,距离上一次写博文已经过去近整整十个月,还是有一些思考,但还是变得懒惰了,心思也不再那么专注,有点耗费时间,学习也有点停滞不前,那就顺其自然,随心所欲吧,等哪天心血来潮,想写了就写写 模型自动 ...

  3. java的URI和URL的关系

    java的URI和URL到底是什么 在我们做开发时,经常有URI和URL弄混的问题,如果当时直接看URI和URL的源码就不可能弄混.首先我总结一下URI和URL的关系:他们的关系是:URL是一种特殊的 ...

  4. Python图像处理丨带你认识图像量化处理及局部马赛克特效

    摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...

  5. Prometheus样本采集器汇总

    系统基本信息 Linux Servers: Exporter https://github.com/prometheus/node_exporter Dashboard https://grafana ...

  6. 第六章:Django 综合篇 - 2:核心配置项

    Django的默认配置文件中,包含上百条配置项目,其中很多是我们'一辈子'都不碰到或者不需要单独配置的,这些项目在需要的时候再去查手册. 强调:配置的默认值不是在settings.py文件中!不要以为 ...

  7. MySQL 自增字段取值

    1 前言 本文来自回答思否网友的一个问题,这个网友新建了一张表,auto_increment_increment设为10,AUTO_INCREMENT主键起始值设为9, 当他插入数据的时候,发现主键值 ...

  8. NAT模式下的虚拟机连接主机网络

    基于NAT模式的VMware虚拟机(Linux CentOS 7)连接主机(Windows 11)网络 一.什么是NAT模式 虚拟机连接主机网络的三种方式: Bridged(桥接) NAT(网络地址转 ...

  9. javaweb 导出文件名乱码的问题解决方案

    fileName = new String(fileName.getBytes("ISO8859-1"), "UTF-8"); 或者 String finalF ...

  10. 原生JavaScript

    原生JavaScript 为了方便查看. 所有的js和css代码都是嵌入式直接写在html代码中 1.js的引入方式 <!DOCTYPE html> <html lang=" ...