以前我们如果定义一个枚举类型 ,然后定义一个枚举变量,那么这个枚举变量只能为类型中的一个值,现在我们想要一个变量能够代表多个值:

今天看《Pro Net 2.0 Windows Forms And Custom Cortrols In C#》时看到枚举一节,发现了在一个枚举里面需要合并多个值,看到了用到了”|”运算符,原来没怎么注意,今天想了一下为什么用”|”呢?
在MSDN里面看到了这样一句话:“用2的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。”
于是写了一个例子:

 [FlagsAttribute]  加上他枚举变量才能进行位或操作
 enum Colors_1
 {
 Red = 1, Green = 2, Blue = 4, Yellow = 8
 };
 //测试
 private void button1_Click(object sender, EventArgs e)
 {
 Colors_1 color_1 = Colors_1.Red | Colors_1.Green | Colors_1.Blue
| Colors_1.Yellow;

 string strResult = color_1.ToString() + " " + ((int)color_1)
.ToString();
 MessageBox.Show(strResult);
 }

输出结果:

咦! 1 + 2 + 4 + 8 = 15 刚刚等于15,难道这是巧合?
全部显示出来了,安逸!

再写个例子试试:

 [FlagsAttribute]
 enum Colors_2
 {
 Red = 1, Green = 2, Blue = 3, Yellow = 4
 };
 //测试
 private void button1_Click(object sender, EventArgs e)
 {
 Colors_2 color_2 = Colors_2.Red | Colors_2.Green | Colors_2.Blue
| Colors_2.Yellow;

 string strResult = color_2.ToString() + " " + ((int)color_2).ToString();
 MessageBox.Show(strResult);
 }

输出结果:

晕,怎么没把颜色全部显示出来呀?
咦!3 + 4 = 7 刚好显示枚举值为3,4的两种颜色

再写一个例子呢?

 //测试
 private void button1_Click(object sender, EventArgs e)
 {
 Colors_1 c = (Colors_1)Enum.Parse(typeof(Colors_1), "7");
 MessageBox.Show(c.ToString() + " " + ((int)c).ToString());
 }

输出结果:

居然会自动转换成相应的枚举值,厉害!

再来我加个枚举为7的值:

 [FlagsAttribute]
 enum Colors_1
 {
 Red = 1, Green = 2, Blue = 4, Yellow = 8, Seven = 7
 };
 //测试
 private void button1_Click(object sender, EventArgs e)
 {
 Colors_1 c = (Colors_1)Enum.Parse(typeof(Colors_1), "7");
 MessageBox.Show(c.ToString() + " " + ((int)c).ToString());
 }

输出结果:

印证了MSDN那句话,只有将枚举值设置为0,2,4,8…..这样的只才会叠加,枚举会自动判断当前值,如果枚举里面有这个值当然就显示这个值了;如果没有就做匹配用加法看看那几个数加起来刚好是这个枚举值,但如果有几个数字加起来都等于这个值怎么办呢?还没遇到呢,目前这是我的理解,希望大牛些指教!

运用:::::

[Flags]  //注意标志
    public enum myColor
    {
     None=0,  Red=1,Green=2,Blue=4,Yellow=8
    };

private void Form1_MouseClick(object sender, MouseEventArgs e)
        {

myColor my=myColor.None;
           //添加

if(红色)

my=my|myColor.Red;

if(绿色)

my=my|myColor.Red;

........

//提取

if(my&myColor.None=myColor.None)?ture:false;

if(my&myColor.None=myColor.Red)?ture:false;

string nnn = mmm.ToString();

MessageBox.Show(nnn);

}

C#里面的枚举与位或运算符 一个枚举变量存入多个值的更多相关文章

  1. 【&】位与运算符【|】位或运算符之权限控制算法

    [&]位与运算符: 按位与运算符"&"是双目运算符. 其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1 ,否则为0.参与运算的数 ...

  2. 《Python CookBook2》 第一章 文本 - 每次处理一个字符 && 字符和字符值之间的转换

    文本 - 总结: 什么是文本Python 中的string 类型是不可变类型.文本,一个字符的矩阵,每一个单独的文本快可以被缩进和组织起来. 基本的文本操作①解析数据并将数据放入程序内部的结构中:②将 ...

  3. SQL查询一个表里面某个字段值相同的数据记录

    好长时间没有用SQL了...还停留在学生时代的水平... 转: 昨天遇到个面试题:查询一个表里面某个字段值相同的数据记录,好久没有写过这种,还真的花了点时间才写出来.如表g_carddetail,有 ...

  4. Python enum 枚举 判断 key(键) 或者 value(值)是否在枚举中

    Python enum 枚举 判断 key(键) 或者 value(值)是否在枚举中 python 的基本用法请浏览:https://www.cnblogs.com/ibingshan/p/98564 ...

  5. 3、输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用栈“先进后出”的性质,将链表的值存入到栈里,然后将栈里的值存入到构建好的容器里,最后打印容器. class So ...

  6. 实现一个键对应多个值的字典(multidict)

    一个字典就是一个键对应一个单值的映射.如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面.比如,你可以像下面这样构造这样的字典: d = { , , ], , ...

  7. [Jmeter]Xpath获取元素某个属性的值,以及获取最后一个元素某个属性的值

    XPath获取元素某个属性的值 XPath query:  clients/attribute::total XPath获取最后一个元素某个属性的值 XPath query:   /clients/c ...

  8. 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction

    今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...

  9. ssas 为绑定指定的大小太小,导致一个或多个列值被截断

    错误信息:ssas 为绑定指定的大小太小,导致一个或多个列值被截断 如果更改了某个维度或是事实表的字段长度,在处理CUBE时提示此错误,我们要做以下更新: 1.刷新数据源视图. 2.打开多维数据集,查 ...

随机推荐

  1. build path libraries java基础--Jar包添加到build path方式说明--01

    摘自: http://blog.csdn.net/haolongabc/article/details/7007701 java基础--Jar包添加到build path方式说明--01 前言:这段短 ...

  2. PyDev:warning: Debugger speedups using cython not foun

    在eclipse下调试代码开始时总提示一个警告: warning: Debugger speedups using cython not found. Run '"C:\Python36\p ...

  3. Thinkphp学习笔记5-URL生成U方法

    为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响. 定义规则 ...

  4. 转:修改Android签名证书keystore的密码、别名alias以及别名密码

    转自:http://blog.k-res.net/archives/1671.html 二月 5, 2014  |  Posted by K-Res   之前在测试Eclipse ADT的Custom ...

  5. TeamTalk 5

    TeamTalk 5 Repository for TeamTalk 5 development. Download TeamTalk 5 SDK To build the TeamTalk clie ...

  6. Graph Automata Player

    题目action=problem&type=show&id=12839&courseid=269">here 第一道高速幂.同一时候也是第一道高斯消元. 输入的 ...

  7. Unity3D Android播放视频

    http://blog.csdn.net/awnuxcvbn/article/details/17719789 using UnityEngine; using System.Collections; ...

  8. excel 永久保存宏命令

      excel 永久保存宏命令 CreateTime--2018年5月31日10:03:44 Author:Marydon 情形一:下次编辑excel时,仍可使用 Ctrl+s-->选择否,选择 ...

  9. 〖Linux〗不知谁写的,很实用的Linux命令

    第一部分 . sudo 运行上一条命令 sudo !! . HTTP方式共享当前目录 python -m SimpleHTTPServer . vim保存一个root用户文件 :w !sudo tee ...

  10. JDBC 增删改查代码 过滤查询语句

    package test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; i ...