您的位置:首页 > 其它

你所不知道的枚举(flag)?

2015-09-16 22:13 309 查看
      一直以为自己很了解枚举,用起来很顺手,但发现自己知道的只是一部分,枚举原来还可以这么玩,与flag关联做逻辑操作。

     这里主要说的是C#中的内容。

简单回顾下枚举:

定义:枚举是一种特殊的值类型,他可以声明一组命名常量

         
         区别于java(JON SKEET SAY):
                              C#: 命名常量只能是有效的数字,它们不能表达行为,这一点几乎与C#中的其它内容相反。
               java:         表达能力更强,可以声明方法,然后对特殊值重写这些方法。
         
        枚举声明: 枚举类型可以显示的声明基础类型byte,sbyte,short,ushort,int,uint,long,ulong。注意:char不能用作基础类型,没有显示声明基础类型的枚举声明,默认为int。
不能使用完全等效的类型替代“简写版本”:eg:  可以写成 enum Type:Int64  但不能写成 enum Type:System.Int64 
        枚举修饰符:new,public,protected,internal,private,不可以是abstract,sealed。枚举既不可以抽象,也不允许继承。
        枚举成员:可定义零或多个枚举成员,不可以重名;不可以命名为value__,这个名字呗枚举内部保留(VLADIMIR RESHETNIKAO  SAY)。
     枚举成员可以关联常量值,但必须落在枚举基础类型范围里。
     如果枚举成员是枚举类型的第一个枚举成员,那么它的关联值为零。否则,是前一个关联值加一,增加后的值必须落在基础类型的表示范围内。

枚举逻辑运算符关联Flags:

举例说明:
using UnityEngine;
using System.Collections;

/// <summary>
/// 对于一个flag枚举类型,典型值应该为2的n次方,通常用“None”值表示0
/// 使用2的n次方是为了避开Map|Shoes的值为3的类似情况
/// </summary>
[System.Flags]
public enum Type
{
Map = 1,    //帽子
Shoes = 2,  //鞋子
Scarf = 4   //围巾
}

public class Test : MonoBehaviour
{
public Type type;

void Start()
{
//这里只聚了或的例子,还可以尝试&和^
type = Type.Map | Type.Scarf;
Wear (type);
}

void Wear(Type t)
{
if((t&Type.Map)!=0)
Debug.Log("Wear Map");

if((t&Type.Scarf)!=0)
Debug.Log("Wear Scarf");

if((t&Type.Shoes)!=0)
Debug.Log("Wear Shoes");

}
}
结果如图:



这样就说明了,枚举值可以同时表示两个值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: