Bardzo lubię konstrukcję enum. Dzięki niej i wsparciu IDE mogę bardzo łatwo zautomatyzować sobie pracę.

public enum SomeEnum
{
    Dog,
    Cat,
    Lion
}

public class SomeAnimals
{
    public void Sounds(SomeAnimals animal)
    {
        switch (animal)
        {
            case SomeEnum.Cat :
                Console.WriteLine("Meow");
                break;
            case SomeEnum.Dog :
                Console.WriteLine("Wof");
                break;

               ...
         }
    }
}

Po dodaniu nowej wartości w SomeEnum wystarczy tylko…. poprawić wszystkie kawałki kodu, które wykorzystują SomeEnum – w głównej mierze trzeba przeglądnąć wszystkie switche i kaskady ifów. Zamiast stosować Open Close Principle i np. wzorzec Visitor z każdym kolejnym dodaniem do enuma miałem sporo pracy. Teraz coraz częściej dochodzę do wniosku, że enum mógł by nie istnieć. Wiele złego kodu by nie powstało. Czasem enum jest dobry jak w przypadku ustawiania klas do szyfrowania czy określania dostępu w FileStreamie ale pisząc kod częściej lepiej unikać ich niż z nich korzystać.