Что означает BitWise OR ("|") при использовании с оператором возврата? - PullRequest
1 голос
/ 03 марта 2011

В C # .NET кто-нибудь когда-либо видел оператор return внутри метода, который выглядит следующим образом?

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

Как этот оператор BitWise "|" здесь работают? Каков результат этого заявления? Я знаю, как работают операторы BitWise в операторах if ... else ... и т. Д., Но я никогда не видел, чтобы это использовалось таким образом.

Ответы [ 4 ]

7 голосов
/ 03 марта 2011

Buttons - это flags enum .

Это делает его отображаемым в битах, где вы можете использовать побитовые операторы для объединения значений.

В этом случае он вернет значение, представляющее собой растровое изображение, объединяющее все три параметра.

Это сообщение в блоге имеет довольно четкое объяснение (хотя для примера используется &).

1 голос
/ 03 марта 2011

Логически такие методы возвращают набор флагов (перечисление помечено атрибутом Flags).Позже вы можете проверить, установлен ли определенный флаг, используя &.

В этом конкретном примере где-то есть код, который проверяет, показывать ли определенную кнопку.Как то так:

Buttons buttons = GetButtonsToShow();

bool showNewButton = (buttons & Buttons.New) != 0;
0 голосов
/ 03 марта 2011

Выполняет побитовые операции и использует результат в качестве возвращаемого значения.Кнопки - это перечисление, к которому применен 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;
}
0 голосов
/ 03 марта 2011

Если вы разобьете это выражение, оно станет более понятным:

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

Вы видите его сейчас?

Оператор |не изменяет сам оператор возврата.Результат выражения Buttons.New | Buttons.Return | Buttons.Delete возвращается функцией.

...