Являются ли перечисления C# безопасными по типу?

Являются ли перечисления C# безопасными по типу?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
2 599
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Да, они.

Следующее взято из http://www.csharp-station.com/Tutorials/Lesson17.aspx

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

ссылка прогнила

Aleksandr Kravets 10.03.2020 19:24

да.

C#: типы перечислений:

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

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

-Пользователь может контролировать базовый тип (по умолчанию int)

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

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

Ответ принят как подходящий

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

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);

О, это хороший совет. Я этого не знал ... всегда предполагал, что это вызовет исключение InvalidCastException или что-то в этом роде. Однозначно +1 от меня!

Isak Savo 16.10.2008 18:15

Должно быть -1 для Enum.IsDefined ... см. Мой ответ здесь: stackoverflow.com/questions/208404/are-c-enums-typesafe#2090‌ 21

Scott Dorman 16.10.2008 19:27

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

Но разве это ответ на вопрос?

Aleksandr Kravets 10.03.2020 19:27

Для тех, кто предлагает использовать Enum.IsDefined для проверки аргументов ... не делайте этого! Пер Брэд Абрамс (из Обновление рекомендаций по дизайну фреймворка в Enum Design):

There are really two problems with Enum.IsDefined(). First it loads reflection and a bunch of cold type metadata making it a deceptively expensive call. Secondly, as the note alludes to there is a versioning issue here.

Хороший звонок; Я пропустил всю эту заметку при первом чтении сегодня.

John Rudy 16.10.2008 19:36

@ Джон Руди: Спасибо! Я уже знал об этих проблемах, но хорошо иметь возможность указать на некоторую документацию по этому поводу, особенно на примере.

Scott Dorman 16.10.2008 19:43

да, они строго типизированы, безопасны и не могут не препятствовать преобразованию постоянных переменных перечисления в целочисленное значение u hv 2 явно сделать dat например enum days { солнце, пн } int e = (int) days.sun; console.writeline (e);

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

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

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

Другие вопросы по теме