Я бы сказал, что это анти-паттерн. Вот почему Давайте возьмем ваш существующий enum (здесь мы рассмотрим атрибуты для краткости):
public enum Movement
{
TurnedRight,
TurnedLeft,
Stopped,
Started
}
Теперь, скажем, необходимость расширяется, чтобы быть чем-то более точным; скажем, изменение курса и / или скорости, превращение одного «поля» в вашем «псевдоклассе» в два:
public sealed class Movement
{
double HeadingDelta { get; private set; }
double VelocityDelta { get; private set; }
// other methods here
}
Итак, у вас есть кодифицированное перечисление, которое теперь необходимо преобразовать в неизменяемый класс, потому что вы теперь отслеживаете два ортогональных (но все еще неизменных) свойства, которые действительно принадлежат друг другу в одном интерфейсе. Любой код, который вы написали против своего «богатого перечисления», теперь должен быть значительно переработан; тогда как, если бы вы начали с этого как класс, у вас, вероятно, было бы меньше работы.
Вы должны спросить, как код будет поддерживаться с течением времени, и будет ли расширенное перечисление более поддерживаемым, чем класс. Я держу пари, что это не будет более ремонтопригодным. Кроме того, как указал mquander, подход на основе классов более идиоматичен в C #.
Что-то еще, чтобы рассмотреть, также. Если объект является неизменным и является struct
, а не class
, вы получаете ту же семантику передачи по значению и незначительные различия в размере сериализации и размере времени выполнения объекта, как и при использовании перечисления.