【问题标题】:What does a BitWise OR ("|") mean when used with a return statement?当与 return 语句一起使用时,BitWise OR ("|") 是什么意思?
【发布时间】:2023-03-04 11:56:02
【问题描述】:

在 C#.NET 中,有没有人见过这样的方法中的 return 语句?

protected override Buttons GetButtonsToShow()
{
    return Buttons.New | Buttons.Return | Buttons.Delete;
}

这个 BitWise 运算符“|”怎么样?在这里工作?这个声明的结果是什么?我知道 BitWise 运算符如何在 if ... else ... 语句等中工作,但我从未见过它以这种方式使用。

【问题讨论】:

    标签: c# return bit-manipulation


    【解决方案1】:

    Buttonsflags enum

    这使得它可以位映射,您可以使用位运算符来组合值。

    在这种情况下,它将返回一个结合了所有三个选项的位图值。

    This 博文有相当清晰的解释(尽管它使用& 为例)。

    【讨论】:

    • 谢谢你,奥德。我需要一点时间才能完全掌握该博客中的信息,但我相信它会很有帮助。
    • @campbelt - 要理解的主要概念是 FlagsAttribute 所做的事情和二进制的思考(毕竟,二进制是使用位运算符的原因)。
    【解决方案2】:

    从逻辑上讲,此类方法返回一组标志(枚举标有Flags 属性)。稍后您可以使用按位& 检查是否设置了某个标志。

    在这个特定的例子中,某处有检查是否显示某个按钮的代码。像这样的:

    Buttons buttons = GetButtonsToShow();
    
    bool showNewButton = (buttons & Buttons.New) != 0;
    

    【讨论】:

    • 完美,谢谢!这也与 Oded 的回应以及他引用的博客文章一致。我将查看该博客,看看我是否可以解决这个问题。
    • @campbelt - 不客气 :) 如果您觉得这个答案有用,您可以点赞。
    【解决方案3】:

    如果你把这个表达式分解,它会变得更清楚:

    protected override Buttons GetButtonsToShow()
    {
        var returnValue = Buttons.New | Buttons.Return | Buttons.Delete;
        return returnValue;
    }
    

    现在可以看到了吗?

    运算符 |不会改变 return 语句本身。 Buttons.New | Buttons.Return | Buttons.Delete 表达式的结果由函数返回。

    【讨论】:

    • 你确定是这样吗?我在这里是全新的,所以我肯定是错的,但我不确定这是否像条件语句那样工作,如果那是你的意思。
    【解决方案4】:

    它正在执行按位运算并将结果用作返回值。 Buttons 是一个应用了FlagsAttribute 的枚举,如下所示:

    [Flags]
    public enum Buttons
    {
        New = 1,
        Return = 2,
        Delete = 4
    }
    

    GetButtonsToShow() 方法的返回值的用法如下:

    private void DisplayButtons()
    {
        var buttons = GetButtonsToShow(); // int value is 7, 1 + 2 + 4
    
        if ((buttons & Buttons.New) == Buttons.New) // if 7 (111) and 1 (001) equals 1 
        {
            buttonNew.Visible = true;
        }
    
        // above is for clarity, most likely all buttons visibility is set as:
        // buttonX.Visible = (buttons & Buttons.X) == Buttons.X;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 2017-01-22
      • 1970-01-01
      • 2016-09-08
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2017-02-20
      相关资源
      最近更新 更多