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

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

今天看《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);

}

时间: 03-23

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

php使用位与运算符【&】位或运算符【|】实现权限管理

权限值是这样的2^0=1,相应2进数为”0001″(在这里^我表示成”次方”,即:2的0次方,下同)2^1=2,相应2进数为”0010″2^2=4,相应2进数为”0100″2^3=8,相应2进数为”1000″ 要判断一个数在某些数范围内就可以使用 & 运算符(数值从上面的表中得来)如:7=4|2|1 (你也可以简单理解成7=4+2+1)用 & 来操作,可以知道7&4.7&2.7&1都是真的,而如果7&8则是假的 例子:<?php// 定义权限defin

计算一个数组里的重复值并且删去(java)

主要思想: 假设数字里的值都为正 循环判断数组 如果与前面的数字相同则变为-1 然后记录-1的个数算出重复值 然后重新new一个减去重复值长度的新数组 和原数组判断 不为-1的全部复制进来即可 代码如下: 1 package Del_Same_Num; 2 3 public class Del_Same_Num { 4 5 static int count=0; 6 7 //计算重复值 8 public static int count_same_number(int[] a) 9 { 10 f

MySQL 如何在一个语句中更新一个数值后返回该值 -- 自增长种子竞态问题处理

什么是竞态问题? 假设有一个计数器,首先当前值自增长,然后获取到自增长之后的当前值.自增长后的值有可能被有些操作用来当做唯一性标识,因此并发的操作不能允许取得相同的值. 为什么不能使用使用UPDATE语句更新计数器,然后SELECT语句获取自增长后的当前值?问题在于并发的操作有可能获取到相同的计数器值. CREATE TABLE counters ( id INT NOT NULL UNIQUE, -- 计数器ID,多个计数器可以存在一个表中, value INT -- 计数器当前值 ); --

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

XPath获取元素某个属性的值 XPath query:  clients/attribute::total XPath获取最后一个元素某个属性的值 XPath query:   /clients/client[last()]/attribute::order [Jmeter]Xpath获取元素某个属性的值,以及获取最后一个元素某个属性的值,布布扣,bubuko.com

通过反射把一个类的属性的值赋值给另一个类

两个类我就不创建了,具体实现方法如下: /// <summary> /// 通过反射把一个类的属性的值赋值给另一个类 /// </summary> /// <typeparam name="D"></typeparam> /// <typeparam name="S"></typeparam> /// <param name="s"></param>

C之旅(一)运算符——优先级,结合性和求值顺序

本节主要讲基本运算符的优先级,结合性和求值顺序.先看一个表达式- (1 + 2) * 3 + (4 + 5 * (6 + 7 ))记住你对它的运算过程,看完下面的内容之后,也许你会用不同的方式来看待这个表达式. 基本运算符 = + - * / C中没有指数运算.运算符操作的是操作数,操作数就是放在运算符两侧的东西. (1) 赋值运算符 = year = 2016; 读作将值2016赋给year,而非year等于2016.=将2016赋给变量year,是从右到左的,即=具有右结合性.2016 =

day46homework常量字符串拼接结构赋值扩展运算符for-of循环map函数默认值

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01定义常量.html</title> <!--常量--> <script> //常量:1.一旦定义 不能更改 const PI = 3.14;  // console.log(PI); // PI = 3.1415; error 

spring PropertyPathFactoryBean | 获取另一个Bean的某个属性值

一般来说,spring中的Dependency来自于另一个Bean,但是也有一些情况我们需要另一个Bean的某个属性,此时可以使用PropertyPathFactoryBean; eg: 继续次的Dog类: package fuckSpring.propertyEditor; public class Dog { private String name; private String type; private int age; public String getName() { return

C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例

一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.下面实现: 整数向字符串的转换,返回字符串指针,并在main函数中调用printf显示. #include<stdio.h> #include<stdlib.h> #include<string.h> char* swich(int n) { char A[20],B[20]; char*p;//=(char*)malloc(4*sizeof(char)); int i=0,a; int minus=0;