您的位置:首页 > 编程语言 > C#

C# Enum Flags

2015-09-19 11:53 288 查看

enum

enum 全称(Enumeration),即一种由一组称为枚举数列表的命名常量组成的独特类型。

通常情况下,最好是在命名空间內直接定义 enum,以便该命名空间中所有的类都能够同样方便地访问它。

当然,也可以把enum嵌套在类或结构体中。

默认情况下,第一个枚举数的值为 0后面每个枚举数的值依次递增 1。 例如,下面的枚举,Sat 是 0,Sun 是 1,Mon 是 2 等.

例如,下面的枚举,Sat 是 0,Sun 是 1,Mon 是 2 等.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};


如下面的示例所示枚举数可用初始值来重写默认值。

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};


在此枚举中,强制元素序列从 1 而不是 0 开始。 但是,一般建议包括值为 0 的常量。 有关更多信息,请参见 枚举类型(C# 编程指南)

每种枚举类型都有基础类型,该类型可以是除 char 以外的任何整型。 枚举元素的默认基础类型为 int。 要声明另一整型枚举(如 byte),请在标识符之后紧跟类型,然后再使用冒号,如下面的示例所示。

enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};


enum 的标准类型为 byte、sbyte、short、ushort、int、uint、long 或 ulong。

可以给 Days 类型的变量赋以基础类型范围内的任何值,所赋的值不限于已命名的常数。

enum E 的默认值为表达式 (E)0 生成的值。

说明

枚举数的名称中不能包含空白。

枚举最常用在的地方,就是搭配 swith case 來完成 if else 的功能;

enum参考:https://msdn.microsoft.com/zh-cn/library/sbbt4032(v=vs.120).aspx

FlagsAttribute

enum搭配  Flags(System.FlagsAttribute)属性 ,指示可以将枚举作为 bit field(即一组标志)处理。这样就可以对其执行 AND与(&)、OR或(|)、NOT非(~) 和 XOR异或(^) 位元运算。

C#运算符 https://msdn.microsoft.com/zh-cn/library/6a71f45d.aspx

FlagsAttribute参考:https://msdn.microsoft.com/zh-cn/library/system.flagsattribute.aspx

 

Demo

1.定义enum为CWeaponType

[System.Flags]
public enum CWeaponType
{
Unknow=0,
Normal=1, // 出击武器
Mat=2,    // 进化未知素材
Cat=4,    // 进化素材猫
Mouse=8,  // 进化素材鼠
Plus=16,   // 加蛋
Exp=32,    // 经验猪
WakeUp=64, // 觉醒碎片
Money=128,  // 金钱猫
Crit=256,   // 暴击碎片
Fragment=512,// 英灵碎片

Weapon = Normal | Fragment //武器
}


.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

2.判断fragment是否为武器

private void Start()
{
var type1 = CWeaponType.Fragment;
var type2 = CWeaponType.Exp;
var log1 = string.Format("{0} is weapon:{1}", type1, (int) (CWeaponType.Weapon & type1) != 0);
var log2 = string.Format("\t {0} is weapon:{1}", type2, (int) (CWeaponType.Weapon & type2) != 0);
Debug.LogWarning(log1 + log2);
}


.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3.运行结果

Fragment is weapon:True     Exp is weapon:False

此demo 就是判断 fragment 是否属于weapon?

代码中使用 & 符号判断,结果为 0 就不属于,结果为(int)CWeaponType.Fragment 就是属于。

 

附:把字符串转成枚举

CWeaponType type= (CWeaponType) Enum.Parse(typeof (CWeaponType), "Normal");


获取枚举的名字

string enumName=Enum.GetName(typeof (CWeaponType), 4);


//结果输出: Cat


参考资料

http://www.dotnetperls.com/enum-flags

http://www.dotblogs.com.tw/atowngit/archive/2009/11/19/12051.aspx?fid=70079
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: