Я раньше не использовал побитовое перечисление, и я просто хочу убедиться, что мое тестирование верное. Меня больше всего интересует тестирование значений None и All. Мы получаем данные из веб-службы, которая использует это перечисление для категоризации определенных частей данных. Учитывая это, я предполагаю, что ничтожное Нет или Все никогда не будут объединены ни с какой другой ценностью.
С учетом следующего поразрядного определения перечисления:
[System.FlagsAttribute()]
public enum TrainingComponentTypes : int
{
None = 0,
AccreditedCourse = 1,
Qualification = 2,
Unit = 4,
SkillSet = 8,
UnitContextualisation = 16,
TrainingPackage = 32,
AccreditedCourseModule = 64,
All = 127,
}
Я прочитал следующую цитату на этот сайт MSDN относительно FlagAttributes;
Использовать None как имя флага перечислимая константа, значение которой нуль. Вы не можете использовать None перечислимая константа в побитом И чтобы проверить флаг, потому что результат всегда равен нулю. Однако, вы можете выполнить логическое, а не побитовое сравнение между числовое значение и Нет перечислены константу, чтобы определить, в числовом значении.
Является ли логическое сравнение в этом случае ссылкой на обычный тест равенства для перечислений? Например:
TrainingComponentTypes tct = TrainingComponentTypes.None;
if (tct == TrainingComponentTypes.None)
{ ... }
Для побитового сравнения я выполняю следующее:
TrainingComponentTypes tct = TrainingComponentTypes.AccreditedCourse | TrainingComponentTypes.Qualification | TrainingComponentTypes.TrainingPackage;
Assert.IsTrue((tct & TrainingComponentTypes.AccreditedCourse) == TrainingComponentTypes.AccreditedCourse, "Expected AccreditedCourse as part the enum");
Assert.IsFalse((tct & TrainingComponentTypes.SkillSet) == TrainingComponentTypes.SkillSet, "Found unexpected SkillSet as part the enum");
Наконец, при тестировании для всех я пробовал как логическое, так и побитовое сравнение, и оба они возвращают то же самое. Должен ли я использовать один над другим здесь? Например:
TrainingComponentTypes tct = TrainingComponentTypes.All;
Assert.IsTrue((tct & TrainingComponentTypes.All) == TrainingComponentTypes.All, "Expected All as part the enum");
Assert.IsTrue((tct) == TrainingComponentTypes.All, "Expected All as part the enum");
// The follow also pass the assertion for a value of All
Assert.IsTrue((tct & TrainingComponentTypes.Qualification) == TrainingComponentTypes.Qualification, "Expected Qualification as part the enum");
Assert.IsTrue((tct & TrainingComponentTypes.TrainingPackage) == TrainingComponentTypes.TrainingPackage, "Expected TrainingPackage as part the enum");
Итак, в общем, я хотел бы знать следующее о побитом enums;
- Мое понимание логического сравнение правильное с учетом моего примера выше?
- Я так понимаю поразрядное сравнение правильное?
- Каков правильный способ обработки "Все", значение (побитовое или логическое). Я не уверен, что когда-нибудь получим ценность, когда All был объединен с другими TrainingComponentTypes. Я не понимаю, почему мы хотели бы, но тогда вы никогда не знаете?
- Правильно ли я полагаю, что переключатель в сущности, не должно быть используется для побитовых перечислений (при условии, что нет представляется особым случаем и требует логического сравнения)?
Спасибо, Крис