C#方法(“项目一”|“项目二”)的含义/执行
本文关键字:项目 执行 项目二 方法 项目一 | 更新日期: 2023-09-27 18:16:04
我以前见过以下类型的代码:
Method("item one" | "item two")
它到底做什么?在我的代码中,我有。
IsInRole(RoleEnum.Administrator | RoleEnum.Moderator)
我希望它会发生的情况是,它检查角色是Administrator或Moderator,但当用户只是Administrator时,它返回false。我不确定你这样做时它叫什么,但我有兴趣知道它到底是什么,以及你可以使用这样的东西的理由/时间。
|
执行输入的逐位"或"运算。类似地,CCD_ 2执行逐位AND。因此,如果在一个方法中,您通过:
- ((1(10|(2(10(:呼叫将有效通过((00000001(2|00000010(<2>
- (1(10&(2( 10(:调用将被有效传递((00000001(2&(00000010(2(=(0(10
它被大量使用的一个常见实例是文件权限,它构成了最基本的计算机安全版本。文件系统权限中的数字表示法本质上是使用位"与"answers"或"来决定用户/组对特定文件的权限。
在你的情况下,答案是,不,你不能那样做。IPrincipal.IsInRole
采用字符串,而不是枚举值。
要解决你的问题,你需要使用逻辑或运算符,并像这样重组调用:
IsInRole(RoleEnum.Administrator) || IsInRole(RoleEnum.Moderator)
(假设RoleEnum
中的值是字符串。如果不是,请参阅末尾了解更多信息。(
那么|
操作符是做什么的呢?它是按位或运算符。假设我们有两个二进制数0100
和0010
。or运算符通过查看每个位的位置来组合它们,如果其中一个(或两者(为1,则结果中的相同位置为1。对于以上的两个数字
0100 |
0010 =
0110
现代处理器内置了许多这种运算符,因此这些运算速度非常快。
对于枚举,C#还允许您指定Flags
属性,该属性表示默认情况下,枚举的每个成员都表示值的数字表示形式中的一位。这允许快速组合和测试标志,并允许在单个标准int
中存储32个值。这是因为所有枚举的内部类型都是核心数字类型之一。
如果RoleEnum
中的值不是字符串,而是实际的enum
类型,则需要进行一些修改。为了便于讨论,让我们这样定义RoleEnum
:
[Flags]
public enum RoleEnum
{
Administrator,
Moderator,
User,
Guest,
}
假设您有一个函数,需要检查用户是否具有多个角色中的一个。它可能看起来像这样:
public bool IsInAnyRole(RoleEnum userRoles)
{
bool ok = false;
if (userRoles.HasFlag(RoleEnum.Administrator))
{
ok |= IsInRole("Administrator");
}
if (userRoles.HasFlag(RoleEnum.Moderator))
{
ok |= IsInRole("Moderator");
}
if (userRoles.HasFlag(RoleEnum.User))
{
ok |= IsInRole("User");
}
if (userRoles.HasFlag(RoleEnum.Guest))
{
ok |= IsInRole("Guest");
}
return ok;
}
(将|=
更改为&=
会将函数更改为IsInAllRoles
(
然后可以作为调用
bool inRole = IsInAnyRole(RoleEnum.Administrator | RoleEnum.Moderator);