c#中利用“|”运算组合多项
前几天看到一段代码
int i = GetCount(para1 | para2);
咋一看有些莫名奇妙,怎么传参的时候带了个或运算,其实这里面是有讲究的,查阅了各方资料,QQ群里赖着大牛问,才搞明白。这个运算可以用来进行多项组合。
举个例子,在设计权限的时候,你肯定会这样设计,权限A,做什么,权限B,做什么,权限C,做什么...如此定义权限,在调用处理函数时,我们直接传对应的权限Id就行,假设用户甲有A权限,我很明确得传权限A的Id,用户乙有B权限,我传B权限的Id,这样看来似乎是合理的。但是,如果用户丙同时有A权限和B权限怎么办呢,你可能会说,那我定义权限的时候定个AB’的权限好了,这样凡是同时有A和B权限的用户传AB’的Id就行了,我一开始也是这么想的,不过,这个做法是不推荐的,也是不巧妙的,假如还有用户同时有ABC权限,或者BC权限,或者CD权限,那么我就什么事也不用干了,就一直在给它定义类型了。
推荐的做法是,传参用“|”运算组合,处理用“&”运算拆分,这样,调用者可以随意组合,而对于处理者,则只定义最基本的单个处理“&”判断即可。看个例子:
定义一个枚举表示权限类型:
public enum Privilege
{
Read = 0x01,
Write = 0x02,
Add = 0x04,
Delete = 0x08,
}
public void GetPrivilege(Privilege pri)
{
if ((pri & Privilege.Read) == Privilege.Read)
{
//do something
}
if ((pri & Privilege.Write) == Privilege.Write)
{
//do something
}
if ((pri & Privilege.Add) == Privilege.Add)
{
//do something
}
if ((pri & Privilege.Delete) == Privilege.Delete)
{
//do something
}
}
...
GetPrivilege(Privilege.Read);
GetPrivilege(Privilege.Write);
GetPrivilege(Privilege.Add);
GetPrivilege(Privilege.Delete);
GetPrivilege(Privilege.Read | Privilege.Write);
GetPrivilege(Privilege.Write | Privilege.Add);
GetPrivilege(Privilege.Read | Privilege.Write | Privilege.Add);
...
0x01
0x02
0x04
0x08
为什么我不定义成0x01,0x02,0x03,0x04,这是就依赖于我一开始讲的“|”和“&”运算了,“|”或运算是只要有1方为1就为1,“&”与运算是两者都为1才为1,把0x01,0x02,0x04,0x08转成2进制就是
任何两个组合,都会在自己的位上变为1。之后再拆分,由于之前组合过,自然就能精准地定位了。比如0x1和0x8组合,组合后就是1001,那么之后通过“&”来拆分,当&0x1时就能进去,&到0x8时也能进去,像这种0x01,0x02,0x04,0x08用行话讲叫“开关位”,今天在QQ群里问人被人说,哎~丢银啊~
c#中利用“|”运算组合多项的更多相关文章
- 在JAVA中利用public static final的组合方式对常量进行标识
在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这 ...
- Atitit 如何利用先有索引项进行查询性能优化
Atitit 如何利用先有索引项进行查询性能优化 1.1. 再分析的话就是我们所写的查询条件,其实大部分情况也无非以下几种:1 1.2. 范围查找 动态索引查找1 1.2.1. 索引联合 所谓的索引联 ...
- GBDT基本理论及利用GBDT组合特征的具体方法(收集的资料)
最近两天在学习GBDT,看了一些资料,了解到GBDT由很多回归树构成,每一棵新回归树都是建立在上一棵回归树的损失函数梯度降低的方向. 以下为自己的理解,以及收集到的觉着特别好的学习资料. 1.GBDT ...
- ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100)
原文:ArcGIS中利用ArcMap将地理坐标系转换成投影坐标系(从WKID=4326到WKID=102100) 对于非地理专业的开发人员,对与这些生涩的概念,我们不一定都要了解,但是我们要理解,凡是 ...
- 【转】asp.net中利用session对象传递、共享数据[session用法]
来自:http://blog.unvs.cn/archives/session-transfer-method.html 下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值 ...
- 在虚拟机的linux中利用VMware Tools实现与windows共享文件
很多人都知道安装"VMware Tools"可以实现与windows共享,但是其实它的功能远不止此.安装了"VMware Tools"后,虚拟机的网络. ...
- asp.net中利用session对象传递、共享数据[session用法]
下面介绍Asp.net中利用session对象传递.共享数据用法: 1.传递值: 首先定义将一个文本值或单独一个值赋予session,如下: session[“name”]=textbox1.text ...
- js中位运算的运用
原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...
- 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数
C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁 //站点:www.cn ...
随机推荐
- 通过代码理解Asp.net4中的几种ClientIDMode设置.
以前我们可以通过ClientID在JavaScript脚本中服务器端控件.比如: document.getElementById("<%=控件.ClientID %>" ...
- js监听页面的scroll事件,当移到底部时触发事件
//页面拉到底时自动加载更多 $(window).scroll(function(event){ var wScrollY = window.scrollY; // 当前滚动条位置 var wInne ...
- css hack 浏览器携带自身特有的属性 (二)
css hack 浏览器携带自身特有的属性,才是我们真正要解决的css 兼容问题. 这里只是分享思路. 举例子: 1 outline,尤其是一些 自带继承特性的属性.这里指的是 隐性的inherite ...
- FAST FW150R软件版本升级解决一些网页无法加载问题
家里用的移动宽带,通过无线路由器无线上网.上taobao.天猫都很快,但是一上京东.苏宁易购界面加载很慢,界面无法显示,怀疑是无线路由问题,然后直接通过网线相连接,发现问题消失,决定对无线路由软件版本 ...
- macOS Sierra 最新系统找回允许任何软件安装
终端输入就可以了 安装macOS Sierra后,会发现系统偏好设置的“安全与隐私”中默认已经去除了允许“任何来源”App的选项,无法运行一些第三方应用. 如果需要恢复允许“任何来源”的选项,即关闭G ...
- selenium报错信息-- Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案
本以为是缺少utf-8造成的错误,但是加完这个还是报错,于是在网上百度了一下是因为上传的路劲粗无偶导致的 正确的写法是把路劲中“\”变为“\\”,或者在路劲的开头加上“r”,或者在路劲的开头加上“r” ...
- 【Python图像特征的音乐序列生成】数据集制作的一些tricks
关于数据集的制作,我决定去掉很多不必要的东西,比如和弦,于是我选择了melody部分的旋律. 有了midi文件,我现在要abc序列,所以我要通过midi2abc转换一下文件. 批处理程序效果如下: 文 ...
- OpenLayers 3 的 图层控制控件
openlayers3的control中没有提供默认的图层控制控件. 但是git上已经有造好的轮子,直接拿来用就可以了.地址 https://github.com/walkermatt/ol3-lay ...
- 问题驱动的Git学习
(搬运自我在SegmentFault的博客) 本人是个Git新手,平时用Git最多的就是push,因为别的都不怎么会用.这几天因为在小组中负责代码的整合,顺便将代码提交到Github,接触到了Git更 ...
- 并发教程--JAVA5中 计数信号量(Counting Semaphore)例子
并发教程--JAVA5中 计数信号量(COUNTING SEMAPHORE)例子 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java中的计数信息量(C ...