C#方法("第一项" |"第二项")含义/执行

时间:2015-10-03 17:34:07

标签: c# operators

之前我见过以下类型的代码:

Method("item one" | "item two")

它到底是做什么用的?在我的代码中,我有。

IsInRole(RoleEnum.Administrator | RoleEnum.Moderator)

我期望它发生的是它检查是在管理员或管理员角色中,但当用户只在管理员中时它返回false。我不确定当你这样做时它叫什么,但我有兴趣知道它究竟做了什么,以及你可以使用类似的东西的推理/时间。

2 个答案:

答案 0 :(得分:1)

|执行输入的按位OR。类似地,&执行按位AND。因此,如果在方法中,您传递:

  1. ((1) 10 |(2) 10 ):呼叫将被有效传递((00000001) 2 |(00000010) ) 2 )=(3) 10
  2. ((1) 10 &(2) 10 ):呼叫将被有效传递((00000001) 2 & (00000010) 2 )=(0) 10
  3. 一个常用的例子是大量使用它并构成计算机安全的最基本版本的是文件权限Numeric Notation in File System Permissions本质上是使用按位ANDing和ORing来决定用户/组对特定文件的权限。

答案 1 :(得分:0)

在你的情况下答案是,不,你不能这样做。 IPrincipal.IsInRole采用字符串,而不是枚举值。

要解决您的问题,您需要使用逻辑或运算符,并重新调整调用,如下所示:

IsInRole(RoleEnum.Administrator) || IsInRole(RoleEnum.Moderator)

(假设RoleEnum中的值是字符串。如果不是,请参阅结尾以获取更多信息。)

那么|运营商做了什么?它是按位或运算符。假设我们有两个二进制数01000010。 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);