【问题标题】:C# Method("item one" | "item two") meaning/executionC# Method("item one" | "item two") 含义/执行
【发布时间】:2015-10-03 17:34:07
【问题描述】:

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

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

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

IsInRole(RoleEnum.Administrator | RoleEnum.Moderator)

我希望它发生的方式是它检查角色是管理员还是版主,但当用户只是管理员时它返回 false。我不确定当你这样做时它叫什么,但我很想知道它究竟做了什么以及你可以使用类似东西的推理/时间。

【问题讨论】:

  • 术语“按位或”将帮助您找到答案。但它不适用于字符串。如果您对您的代码为什么不工作有疑问,请显示您的代码。
  • 这个reference link 可能会有所帮助。

标签: c# operators


【解决方案1】:

| 执行输入的按位或。同样& 执行按位与。所以如果在一个方法中,你通过了:

  1. ((1)10 | (2)10):调用将有效传递((00000001)2 | (00000010 )2) = (3)10
  2. ((1)10 & (2)10):调用会有效传递((00000001)2 & (00000010) )2) = (0)10

它被大量使用并构成最基本的计算机安全版本的一个常见实例是文件权限Numeric Notation in File System Permissions 本质上是使用按位与和或来决定用户/组对特定文件的权限。

【讨论】:

  • | 也可能意味着输入的逻辑 OR,尽管在这种情况下这不太可能。
  • @LasseV.Karlsen:我还没有遇到过这种情况......这是哪种语言?
  • 问题中的语言,C#| 可以对整数(按位或)和布尔值(逻辑或)进行运算。在布尔操作数的情况下,||| 之间的区别在于 || 将短路,这意味着如果第一个操作数的评估是 true 那么评估第二个操作数没有意义,而| 将始终评估两者。
  • @LasseV.Karlsen:真的!?请给我指出这种情况的一些例子。我很乐意学习。 :)
  • 如果a() 返回truea() || b() 甚至不会调用b(),因为最终结果是已知的。如果你改用,那么a()b() 都会被调用,而不管a() 返回什么。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2012-05-29
    • 2011-03-31
    • 2019-10-08
    相关资源
    最近更新 更多