Подтвердить что ты не робот

Перечислены ли перечисления С#?

Перечислены ли перечисления С#?

Если нет, то какие последствия?

4b9b3361

Ответ 1

Чтобы дать немного другой ответ... в то время как значения являются безопасными по типу с точки зрения кастинга, они все еще не отмечены, как только они были выбраны - i.e.

enum Foo { A = 1, B = 2, C = 3 }    
static void Main()
{
    Foo foo = (Foo)500; // works fine
    Console.WriteLine(foo); // also fine - shows 500
}

По этой причине вы должны позаботиться о проверке значений - например, с помощью default в switch, которая выдает исключение.

Вы также можете проверить (для значений не [Flags]) с помощью:

bool isValid = Enum.IsDefined(typeof(Foo), foo);

Забастовкa >

Ответ 2

Да, они есть.

Ниже приведено http://www.csharp-station.com/Tutorials/Lesson17.aspx

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

Ответ 3

Для тех, кто предлагает использовать Enum.IsDefined для проверки правильности аргументов... не надо! Per Brad Abrams (из Обновление руководств по дизайну каркаса в Enum Design):

Есть действительно две проблемы с Enum.IsDefined(). Сначала он загружает отражение и кучу метаданных холодного типа, что делает его обманчиво дорогостоящим вызовом. Во-вторых, как отмечается в примечании, здесь есть проблема с версией.

Ответ 4

Да, они.

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

Ответ 5

Да.

С#: перечисление типов:

-Абезопасное перечисление именованных значений.

- предотвращает ошибки программирования

-User может управлять базовым типом (по умолчанию для int)

- также может управлять базовыми значениями

Ответ 6

Технически нет, потому что вы можете представить Enum в качестве базового значения (int, long и т.д.). Однако, если вы убедитесь, что используете только перечисление по его предоставленным именам, вы получите ошибки времени компиляции, если вы измените имя перечислимого значения без обновления его ссылок. В этом отношении да, это безопасный тип.

Ответ 7

Я опаздываю на вечеринку здесь, но я хотел выбросить что-то еще... Обновление для . от Krzysztof Cwalina. В дополнение к превосходному подсказку выше при проверке того, чтобы действительное значение передавалось в ваш Enums, это дает другие рекомендации и рекомендации относительно того, как их эффективно использовать, кучу gotchas (особенно задействованные перечисления Flags) и т.д.

Ответ 8

да, они сильно набрали безопасный u, не может ли он не прибегнуть к конверсии константных переменных enum в целочисленное значение u hv 2 expilcitly do dat например enum days { солнце, понедельник } int e = (int) days.sun; Console.WriteLine(е);

Ответ 9

Переменные перечисления С# имеют тип безопасного значения

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

Я подошел к отличному видеоуроку по перепискам, которые демонстрируют свой тип безопасного характера. Посмотрите здесь и там.