c# 枚举基础有[flags]和没有的的区别
枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性。在 C# 中,使用 enum 来声明枚举。
枚举分为简单枚举和标志枚举两种。
基本语法示例
以下格式也可以:
枚举类型
枚举类型可以是:byte、sbyte、short、ushort、int、uint、long、ulong,如果没有指定类型,则默认为 int 类型。指定类型示例:
枚举数的值
默认情况下,第一个枚举数的值为 0,后面每个枚举数的值在前一个枚举数的值基础上递增 1。当然,也可以自行指定,例如:
枚举数大小写敏感
比如以下枚举有两个枚举数:
取枚举数的值
虽然枚举有类型,但取枚举数的值时,仍然需要进行类型转换。
枚举不能放在函数中
枚举可以与类平级,也可以作为类的 field,但不能放在函数中。可以加 public 等修饰符。
以下是使用枚举时几条好的建议。
优先考虑使用枚举,而不是类的静态常量
比如:
应该使用如下的枚举:
如果参数、返回值、变量等类型可以是枚举,则不要使用其它基础类型
比如:
枚举命名
枚举一般使用名词或名词组合,简单枚举使用单数,标志枚举使用复数。
大多数情况下不需要更改枚举的默认类型
也就是说大多数情况下,使用 int(System.Int32)作为枚举类型。除非:
- 枚举是标志枚举,且标志多于 32 个(此时 int 类型装不下)。
- 枚举被非常大量且频繁地使用,为了节约空间使用小于 int 的类型。
- 不得不使用其它类型的情况。
不要在枚举中设置哨兵
我们可能觉得在枚举的两端加上哨兵,这样在判断一个数是否在枚举中时,只需要判断是否在哨兵之中。非常不幸,我们不应该这么做,这破坏了枚举的意义。
- 简单枚举包含的值不用于组合,也不用于按位比较。
- 标志枚举应使用按位 OR 操作进行组合。
简单枚举
前面提到的 Day、Range 都可以称之为简单枚举,因为不能将他们各自的值组合起来。
标志枚举
标志枚举的设计有两点要注意。
- 指明 FlagsAttribute,以指示可以将枚举作为位域(即一组标志)处理。
- 枚举中各标志的值应该是以 2 的幂来赋值,即:1、2、4、8、16、32……
举个例子,假如我们在设计 Windows 窗口程序,窗口有最小化、最大化、关闭按钮,我们想任意组合显示,也就是说我们可以显示其中的任意 0 个或一个或多个按钮。
如果使用简单枚举,按照排列组合,我们要使用 1 + 3 + 3 + 1 = 8 个枚举数,如果这里不是三个按钮,而是四个按钮,枚举数就更多了。所以这样不现实。
为什么这里使用简单枚举不现实呢?因为简单枚举不能组合,采用标志枚举就可以轻松解决了。
我们在设置窗口样式时,利用 OR 自由组合:
这就是为什么标志的值要按 2 的幂排列的原因了,也是为什么标志多于 32 个时不能使用 int 类型的原因了。
通常我们为常用的标志组合提供特殊的枚举值
仍然以上述窗口为例,可知大多数情况下,我们均要显示这三个按钮,所以每次使用时都要用:
实在有些繁琐,我们可以修改枚举为如下:
增加一个 ALL_BUTTON 为前三个标志的值。使用时直接用 ALL_BUTTON 就可以了。
using System; using System.Collections.Generic; using System.Text; using System.Globalization;
namespace test { public enum Style:int { lenovo=1, acer=2, dell=3 }
public class PublicBLL { private int _itemtype;
public static int ItemType { get { return _itemtype; } set { _itemtype = value; } } } }
PublicBLL.ItemType返回的就是int型的1 or 2 or 3。
如若判断其值是否等于一个枚举 if (PublicBll.ItemType==(int)Style.lenovo) { //代码段 }
c# 枚举基础有[flags]和没有的的区别的更多相关文章
- C#枚举中使用Flags特性
如果对一个值可以包含多个,那么可以使用枚举,加上Flags 本文告诉大家如何写一个 Flags. 在写前,需要知道一些基础知识,取反.或.与,如果不知道的话,请去看看基础. 当然,这些太复杂了,我也不 ...
- 2019-9-2-C#枚举中使用Flags特性
title author date CreateTime categories C#枚举中使用Flags特性 lindexi 2019-09-02 12:57:37 +0800 2018-2-13 1 ...
- css基础--深入理解opacity和rgba的区别
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...
- Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别
Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别
- C#枚举中使用Flags特性
.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,这样我们就可以用"或"运算符组合 ...
- Enum 枚举基础
1 定义一个枚举 enum Weekend { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 2 得到每个枚举值 f ...
- python基础--absl.flags
之前在tensorflow的mnist例程中看到了使用 absl.flags的方法来载入和解析参数的,出于学习的目的,就自己试验了一下, 代码如下: # *_*coding:utf-8 *_* # a ...
- 【基础网络】TCP与UDP 的区别
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)
1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...
随机推荐
- eclipse 新建项目下后.metadata\.plugins的文件夹解释和如何保存自己的特定工程设置
eclipse 新建项目下后.metadata\.plugins的文件夹解释和如何保存自己的特定工程设置 [org.eclipse.core.runtime] 字体,maven的setting.xml ...
- 在ubuntu系统荣品开发配套JDK安装
chmod 755 jdk-6u29-linux-i586.bin ./jdk-6u29-linux-i586.bin
- 解决eclipse闪退的办法
Eclipse Java EE 便出现打开闪退的现象. 修改eclipse.ini无效,参照了网上许多方法也不行. 最后发现了一个蛋疼的方法: 1.打开eclipse的workspace目录 2.删除 ...
- JZ2440开发笔记(2)——minicom的安装和配置使用【转】
一.安装配置minicom 1.安装minicom lingd@ubuntu:~$ sudo apt-get install minicom 2.配置minicom lingd@ubuntu:~$ s ...
- 【原】 Spark中Worker源码分析(二)
继续前一篇的内容.前一篇内容为: Spark中Worker源码分析(一)http://www.cnblogs.com/yourarebest/p/5300202.html 4.receive方法, r ...
- 2015年9月29日html基础加强学习笔记
创建一个最简便的浏览器 首先打开VS2010,然后在空间里拖出一个Form控件当主页面,其次拖出一个Textbox控件作为地址栏,然后加一个Button控件作为按钮,最后拖出一个WebBrowser作 ...
- 韦东山yy公开课笔记(2)--汇编,段,栈,重定位/链接地址,位置无关吗
1. 要不要学习汇编 可以只懂一点,工作中基本不用,一旦用就是出了大问题 ldr : load 读内存 ldr r0, [r1] : r1里存放的是地址值, 去这个地址读取4字节的内容,存入r0 s ...
- 代码-Weka的LinearRegression类
package kit.weka; import weka.classifiers.Evaluation; import weka.classifiers.functions.LinearRegres ...
- Scala学习笔记(一)数据类型
.类型参数化数组 val arrayString = Array[String](2); arrayString (0)="Hello"; arrayString (1)=&quo ...
- What's the difference between all the Selection Segues
relationship -A "relationship" segue is the segue between a container view controller and ...