Enum的Flag和HasFlag

在枚举Enum中使用Flag多选组合值

有时我们一个枚举变量 可能会包含多个枚举元素, 比如枚举类型:


public enum Week
{
    
    
    None,     
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

在这个星期的枚举类型中,我们定义一个表示工作日的变量 weekDay
这时候我们如果想 给weekDay变量赋值多个枚举值 Monday Tuesday …… 是不可以的。

下面我们就要使用Flags来解决这样的问题,直接上代码

using UnityEngine;
using System.Collections;
using System;
 
 
[Flags]     // Flags关键字允许我们在使用.net 枚举变量时,使用多个组合值
public enum Week
{
    
    
    None = 0,     //  在组合值中,0代表不存在
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32,
    Sunday = 64
}
 
public class FWeek
{
    
    
 
    /// <summary>
    /// 添加枚举元素
    /// </summary>
    /// <param name="w"> 原始变量 </param>
    /// <param name="_wArray"> 要增加的类型</param>
    public static void Add(ref Week w, Week[] _wArray)
    {
    
    
        foreach (Week _w in _wArray)
        {
    
    
            w = w | _w;
        }
    }
 
    /// <summary>
    /// 移除枚举元素
    /// </summary>
    /// <param name="w"> 原始变量 </param>
    /// <param name="_wArray"> 要增加的类型</param>
    public static void Remove(ref Week w, Week[] _wArray)
    {
    
    
        foreach (Week _w in _wArray)
        {
    
    
            w = w & ~_w;
        }
    }
 
    /// <summary>
    /// 是否包含
    /// </summary>
    /// <param name="w"> 原始变量 </param>
    /// <param name="_w"> 要增加的类型</param>
    public static bool IsContain(Week w, Week _w)
    {
    
    
        return 0 != (w & _w);
    }
 
    /// <summary>
    /// 是否为None
    /// </summary>
    public static bool IsNone(Week w)
    {
    
    
        return w != Week.None;
    }
 
}
using UnityEngine;
using System.Collections;
using System;
 
public class Test : MonoBehaviour {
    
    
 
 
	// Use this for initialization
	void Start () {
    
    
        Week weekDay = Week.None;
 
        FWeek.Add(ref weekDay, new Week[] {
    
     Week.Monday, Week.Tuesday, Week.Wednesday, Week.Thursday, Week.Friday, Week.Sunday });
 
        Debug.Log("一周工作日都有星期几:" + weekDay);
 
        FWeek.Remove(ref weekDay, new Week[] {
    
     Week.Sunday });
 
        Debug.Log("周日好像不是工作日:" + weekDay);
 
        bool hasMonday = FWeek.IsContain(weekDay, Week.Monday);
 
        Debug.Log("有没有周一: " + hasMonday);
	}
}

请添加图片描述

c# Enum Flag 下使用 HasFlag() 函数的注意事项

[Flags]
enum eTest
{
    
    
OK = 0 ,
Error1 = 1,
Error2 = 2,
Error3 = 4,
}

在以上的Enum中 , 我们在判断一个 eTest 实例是否有错误 Error1 可以使用 HasFlag(eTest.Error1) 但是如果要判断 是否 OK

不能使用 HasFlag(eTest.OK) ,因为这样始终返回 True , 而要用 eTestInstance == eTest.OK 这样的语句判别

HasFlag()使用示例
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43149049/article/details/123021505