C#方法(“项目一”|“项目二”)的含义/执行

本文关键字:项目 执行 项目二 方法 项目一 | 更新日期: 2023-09-27 18:16:04

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

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

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

IsInRole(RoleEnum.Administrator | RoleEnum.Moderator)

我希望它会发生的情况是,它检查角色是Administrator或Moderator,但当用户只是Administrator时,它返回false。我不确定你这样做时它叫什么,但我有兴趣知道它到底是什么,以及你可以使用这样的东西的理由/时间。

C#方法(“项目一”|“项目二”)的含义/执行

|执行输入的逐位"或"运算。类似地,CCD_ 2执行逐位AND。因此,如果在一个方法中,您通过:

  1. ((1(10|(2(10(:呼叫将有效通过((00000001(2|00000010(<2>
  2. (1(10&(2( 10(:调用将被有效传递((00000001(2&(00000010(2(=(0(10

它被大量使用的一个常见实例是文件权限,它构成了最基本的计算机安全版本。文件系统权限中的数字表示法本质上是使用位"与"answers"或"来决定用户/组对特定文件的权限。

在你的情况下,答案是,不,你不能那样做。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);