У меня есть система, которая должна возвращаться, если первая сущность в порядке, вторая или оба. Я решил вернуть char, представляющий растровое изображение: т.е. 00 - никто, 01 - первый, 10 - второй, 11 - оба. Когда я читаю значения, если результат находится в char res, я проверяю res %2 == 1 и res / 2 == 1 Мой руководитель сказал, что это не читается Что вы предлагаете сделать лучше?

1
Yakov 8 Апр 2014 в 23:59

2 ответа

Лучший ответ

Настройте перечисление следующим образом:

[Flags]
enum myBitSet  : ushort
{ 
    none = 0,
    firstThing = 1,
    secondThing = 2,
    bothThings = 3   // or better firstThing | secondThing
}

Теперь вы можете делать такие вещи, как:

if ((test & myBitSet.firstThing) == myBitSet.firstThing) 
{
    // firstThing was set
}

Что легче читать, потому что вам не нужно помнить, какой бит какой.

А также:

if ((test & myBitSet.bothThings) > 0) 
{
    // either firstThing, secondThing or both were set.
}
2
Matt Burland 8 Апр 2014 в 20:14

Я не знаю, что у вас за система. Класс, метод, фреймворк?

Метод может возвращать несколько результатов через параметры out

public void CheckEntities(Entity a, Entity b, out bool isAOK, out bool isBOK)
{
    isAOK = Test(a);
    isBOK = Test(b);
}

Вы также можете создать специальный тип

public class EntitiesStatus
{
    public EntitiesStatus(bool isAOK, bool isBOK)
    {
        IsEntity1OK = isAOK;
        IsEntity2OK = isBOK;
    }

    IsEntity1OK { get; private set; }
    IsEntity2OK { get; private set; }
}

Вы можете использовать перечисление

[Flags]
public enum EntityStatus
{
    NoneIsOK = 0,
    FirstIsOK = 1,   // = 2^0
    SecondIsOK = 2,  // = 2^1
    BothAreOK = FirstIsOK | SecondIsOK;
}

При использовании FlagsAttribute убедитесь, что все константы перечисления, которые можно комбинировать, являются степенями двойки. Это гарантирует, что любая их комбинация дает разные значения.

У вас есть много вариантов, но не используйте некоторые "волшебные" битовые манипуляции, которые заставят ваш код выглядеть как ранний код c и требуют дополнительных знаний от тех, кто использует ваш результат char. И, кстати, почему char? Даже просто использовать int и константы было бы лучше (хотя и не оптимально). const int FirstIsOK = 1, SecondIsOK = 2; int result FirstIsOK + SecondIsOK;. Это не требует битовых манипуляций.

1
Olivier Jacot-Descombes 8 Апр 2014 в 20:39