Раньше я действительно не использовал побитовые перечисления, и я просто хочу убедиться, что мои тесты верны.Меня больше всего интересует тестирование значений None и All.Мы получаем данные от веб-службы, которая использует это перечисление для классификации определенных фрагментов данных.Учитывая это, я предполагаю, что ни 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 в побитовой операции AND для проверки флага, потому что результат всегда равен нулю.Однако вы можете выполнить логическое, а не побитовое сравнение между числовым значением и константой 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");
Итак, в заключение, я хотел бы знать следующее о побитовых перечислениях:
- Правильно ли мое понимание логического сравнения, учитывая мой пример выше?
- Является ли способ правильного выполнения побитового сравнения?
- Как правильно обрабатывать значение «Все» (побитовое или логическое).Я не уверен, получим ли мы когда-либо значение, в котором All было бы объединено с другими типами TrainingComponentTypes.Я не могу понять, почему мы это сделаем, но тогда, ты никогда не знаешь?
- Прав ли я, предполагая, что операторы switch в основном не должны использоваться для побитовых перечислений (учитывая, что ни один из них не является особым случаем и требует логического сравнения)?
СпасибоКрис