Побитовое вычитание из .Все - PullRequest
0 голосов
/ 19 октября 2018

У меня есть следующий код, и мне интересно, есть ли способ написать побитовый оператор в последнем разделе (Только копировать файлы), чтобы включить оба, задав для него значение All, а затем удалив два других в одной строке.

private void cbInstallType_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (cbInstallType.Text == "Full Install")
        {
            eventFlags = GBFEvents.All;
        }

        else if (cbInstallType.Text == "DB Only")
        {
            eventFlags = (GBFEvents.InitGBFSQL | GBFEvents.PerformDatabaseUpdate);
        }

        else if (cbInstallType.Text == "Copy Files Only")
        {
            eventFlags = GBFEvents.All;
            eventFlags &= ~(GBFEvents.InitGBFSQL | GBFEvents.PerformDatabaseUpdate);
        }
    }

GBFvents определяется так:

    public enum GBFEvents
{
    NONE                        =       0,
    InitGBFSQL                  =       1 << 0,
    ServiceIISControlDown       =       1 << 1,
    SetWebConfigValues          =       1 << 2,
    ReadFilelists               =       1 << 3,
    CopyFiles                   =       1 << 4,
    FixWebConfigValues          =       1 << 5,
    BuildAppPaths               =       1 << 6,
    PerformDatabaseUpdate       =       1 << 7,
    ServiceIISControlUp         =       1 << 8,
    All                         =    ~(-1 << 9)
}

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Я знаю, что у вас уже есть приемлемый ответ на ваш вопрос, но я бы все же предпочел что-то подобное в вашем enum:

public enum GBFEvents
{
    NONE = 0,
    InitGBFSQL = 1 << 0,
    ServiceIISControlDown = 1 << 1,
    SetWebConfigValues = 1 << 2,
    ReadFilelists = 1 << 3,
    CopyFiles = 1 << 4,
    FixWebConfigValues = 1 << 5,
    BuildAppPaths = 1 << 6,
    PerformDatabaseUpdate = 1 << 7,
    ServiceIISControlUp = 1 << 8,

    /* Helpers */

    AllDBEvents = InitGBFSQL | PerformDatabaseUpdate,
    AllServiceEvents = ServiceIISControlDown | ServiceIISControlUp,
    AllConfigEvents = SetWebConfigValues | FixWebConfigValues,
    AllFileEvents = ReadFilelists | CopyFiles | BuildAppPaths,
    All = AllDBEvents | AllServiceEvents | AllConfigEvents | AllFileEvents
}

(могунеправильно описал BuildAppPaths, вы можете считать его более Config связанным, в качестве примера)

И тогда ваш код будет выглядеть так:

eventFlags = AllServiceEvents | AllConfigEvents | AllFileEvents;

(И другой путь будет простоuse AllDbEvents)

Для меня это становится понятнее при чтении того, что «Копировать только файлы» - это не просто копирование файлов, в то время как не нужно иметь тонны опций | в одной строке.И эти вспомогательные значения в вашем enum могут быть повторно использованы и в других областях.

Основная идея состоит в том, чтобы сделать «именованные группы» событий явными в вашем перечислении, вместо того, чтобы корректно объединять их в других частяхвашего кода.

0 голосов
/ 19 октября 2018

Изменение его в одну строку - довольно простой случай просто расширения того, что делают.Итак, шаг за шагом:

var eventFlags = GBFEvents.All;
eventFlags &= ~(GBFEvents.InitGBFSQL | GBFEvents.PerformDatabaseUpdate);

Если мы развернем &=, мы получим:

var eventFlags = GBFEvents.All;
eventFlags = eventFlags & ~(GBFEvents.InitGBFSQL | GBFEvents.PerformDatabaseUpdate);

Если мы затем добавим использование eventFlags во второй строке, мы получим:

var eventFlags = GBFEvents.All & ~(GBFEvents.InitGBFSQL | GBFEvents.PerformDatabaseUpdate);
...