Безопасны ли перечисления C# для типов?

StackOverflow https://stackoverflow.com/questions/208404

  •  03-07-2019
  •  | 
  •  

Вопрос

Безопасны ли перечисления C# для типов?

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

Это было полезно?

Решение

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

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

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

Да, это так.

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

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

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

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

Да, это так.

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

ДА.

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top