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,难道这是巧合?
全部显示出来了,安逸!
再写个例子试试:
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的值:
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);
}
相关文章
- asp.net RSA密钥之C#格式与Java格式转换(PEM格式)
- Explicit Interface Implementation (C# Programming Guide)
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- Word控件Spire.Doc 【文档操作】教程(十四):使用 C# 在 Word 文档中添加、计数、检索和删除变量
- C# (初入江湖)-写个简单的计算器(对象三要素与变量、数据类型)
- C#读取资源文件的两种方法及保存资源文件到本地
- C# struct的陷阱:无法修改“...”的返回值,因为它不是变量
- C# 动态获取、修改、更新配置文件 实现思路
- 浅析C#中foreach引用变量
- C# 实现WEBSOCKET聊天应用示例
- 【转】.NET (C#) 中打印变量的内存地址
- C# 静态变量会被gc回收么?
- C#版Websocket实例
- c#中关于变量声明那么点事