c # enums: могут ли они принимать члены и функции, такие как java enums? - PullRequest
3 голосов
/ 14 сентября 2009

в java можно дать enum конструктор, а также переменные и функции-члены.

Мне было интересно, возможно ли что-то подобное в перечислениях c #. если да, то как?

Большое спасибо!

Ответы [ 9 ]

4 голосов
/ 14 сентября 2009

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

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

1 голос
/ 14 сентября 2009

Одна вещь, которую я всегда любил делать, это использовать атрибут Description в моих перечислениях, чтобы я мог легко хранить 3 значения моего перечисления

Public Enum States
{
    [Description("Florida")]
    FL = 124
}

А потом у меня был класс, который легко считывает / из атрибута description, чтобы я мог хранить всю таблицу кодов базы данных в файле enum. Помимо всех постеров, рассказывающих о методах расширения, вы можете использовать атрибуты для ведения журнала с вашими enum-классами.

Вам все еще нужно использовать другой класс, чтобы фактически что-то делать с перечислением, но вы можете использовать атрибуты, чтобы добавить глубину вашему перечислению, вместо того, чтобы просто иметь пару ключ / значение, которой она в принципе является.

1 голос
/ 14 сентября 2009

Вы можете имитировать шаблон перечисления Java TypeSafe (что было так распространено в Java до того, как enum был введен в Java 5 для его решения):

См. Описание пункта 21 здесь (предупреждение, PDF-ссылка).

Вы бы сделали это, если бы функциональность объекта была более важной, чем функциональность коммутатора, поскольку в C # вы можете получить тип saftey без него (чего не было в Java до 5).

1 голос
/ 14 сентября 2009

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

Вы не можете использовать переменные-члены или конструкторы в перечислении. Может быть, то, что вы ищете, это структура.

Тип структуры - это тип значения, который может содержать конструкторы, константы, поля, методы, свойства, индексаторы, операторы, события и вложенные типы. Объявление структуры принимает следующую форму:

1 голос
/ 14 сентября 2009

Это не так. В Java перечисления являются классом, тогда как в C # перечисление является просто синтаксическим сахаром, оборачивающим примитивный тип.

0 голосов
/ 14 сентября 2009

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

0 голосов
/ 14 сентября 2009

Насколько я знаю, нет, вы не можете в C #. Хотя зачем тебе тоже? Кажется немного странным присоединять переменные и функции!

0 голосов
/ 14 сентября 2009

Это невозможно в C #. Перечисления могут иметь только имена / значения членов.

0 голосов
/ 14 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...