Nano Hash - криптовалюты, майнинг, программирование

Переопределение int для битового перечисления

Я видел некоторый код .NET 2.0, который выглядел так:

 public enum abc : int
 {
  value1 = 1,
  value2 = 2,
  value3 = 4
 }

так далее...

Теперь я знаю, что перечисление флагов можно использовать для битовых значений (как указано выше, верно?), поэтому вы можете сделать | "или" & и т. д., но по какой причине это не используется? Какой смысл переопределять int?

Если бы я разрабатывал перечисление для выбора нескольких значений, я бы использовал атрибут flags и ничего не переопределял (чего я не понимаю). Что означает вышеописанный подход?

Спасибо

26.02.2009

Ответы:


1

Это не «переопределение» int, это указывает, на каком типе основано перечисление. По умолчанию это int, так что на самом деле это ничего не дает, но в некоторых случаях вы можете захотеть основывать перечисление на long для хранения большего количества флагов или byte для экономии места, если вокруг будет очень много экземпляров перечисления, и это только имеет несколько значений, однако в рекомендациях по проектированию фреймворка рекомендуется использовать int, если у вас нет очень веской причины не делать этого.

Если это предназначено для перечисления флагов, то оно должно быть помечено [Flags], и это, кажется, намерение здесь, поэтому упущение выглядит как ошибка. Вы по-прежнему можете комбинировать значения с помощью побитовых операторов, даже если они не отмечены [Flags], но из памяти, я думаю, вы получите предупреждение компилятора (или это может быть предупреждение FxCop, или, возможно, предупреждение ReSharper...).

26.02.2009

2

«: int» указывает, что использовать в качестве базового типа для значений перечисления; здесь можно использовать любой целочисленный тип, кроме char. Значение по умолчанию — int, поэтому в данном случае оно избыточно.

26.02.2009

3

FlagsAttribute только сообщает пользователю, что поля в этом перечислении можно комбинировать; на самом деле он не устанавливает для полей перечисления «отмечаемые» значения. Это вам придется делать самостоятельно, как вы уже это сделали.

26.02.2009

4

Я не вижу никакой пользы. Вероятно отсутствие опыта у программиста.

26.02.2009

5

Если вы спрашиваете сценарий выбора конкретных значений, я не знаю хорошего примера навскидку, но я могу представить что-то вроде

enum Color = {
  Red = 0xFF0000,
  Green = 0x00FF00,
  Blue = 0x0000FF }

может быть полезно.

26.02.2009

6

Установка значений в перечислении без флагов для использования 1-горячей кодировки только ради использования 1-горячей кодировки на самом деле не имеет никакого смысла. Думаю, это имело бы смысл, если бы вы думали, что в будущем сможете сделать его перечислением Flags. В противном случае значения не следует переопределять или присваивать значение на основе их значения (например, Color.Red = 0xFF0000).

26.02.2009

7

Что касается «: int», указывающего базовый тип, если бы я это увидел, я бы осмотрелся и посмотрел, удаляют ли они все свои перечисления таким образом. Если это так, то они, вероятно, просто научились писать перечисления таким образом (или, может быть, они являются гипер-явным кодировщиком). Однако, если только это перечисление было объявлено таким образом, возможно, программист пытается сказать что-то (что, возможно, было бы лучше сказать с комментарием), что очень важно, чтобы это имело базовый тип «int». Возможно, он где-то бинарно сериализуется или десериализуется.

Что касается атрибута [Flags], то с точки зрения C# вы можете использовать побитовые операторы для любого перечисления, а не только для тех, которые объявлены с помощью [Flags]. Из приведенного выше примера без каких-либо [флагов] совершенно законно следующее:

abc myAbcValue = значение1 | значение2;

Основное отличие [Flags] заключается в методах ToString() и Parse() Enum. Без [Flags] myAbvValue.ToString() вернет "3", а с [Flags] вернет "value1, value2". Аналогично с [Флагами],

abc yourAbcValue = (abc)Enum.Parse(typeof(abc), "value1, value2") ;

установит базовое значение yourAbcValue равным 3.

Обратите внимание, что метод IsDefined() в Enum() не допускает множественных значений с перечислениями [Flags], поэтому:

Enum.IsDefined(тип(abc), "значение1, значение2")

возвращает false независимо от использования [Flags].

Также обратите внимание, что [Flags] предоставляет информацию для любого доступа к отражению, и другие языки могут относиться к ограничениям помеченных перечислений иначе, чем к обычным перечислениям.

26.02.2009
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..