И что делать вместо

Конечно, еще будет какой-то случай, когда const может заинтересовать, но в большинстве случаев это не самые лучшие варианты.

Почему бы не использовать константу?

Я часто вижу такие коды:

Затем мы вызываем DoSomething с константами FirstValue или SecondValue. И метод может что-то делать только с этими значениями. Можно проверить значение и сравнить его с этими константами, а затем применить правильный алгоритм. Или может быть путем разбора этих значений, потому что у этих констант есть некоторая логика разбора, или по каким-то другим причинам... В этом примере я использую строковые константы, но они применяются независимо от типа.

Есть две проблемы.

  • Мы не можем использовать автозаполнение при вызове DoSmething, поэтому разработчику сложно определить, какое значение можно принять.
  • Мы можем передать любое значение (в данном случае строку), которое позволит компилятору успешно выполнить сборку, но никогда не будет работать во время выполнения.

Лучший вариант

Создание класса с закрытым конструктором и статическим экземпляром будет иметь тот же эффект, что и константы, но с некоторыми преимуществами.

Поскольку метод DoSomething использует типизированный «PossibleArgument», мы можем дать ему экземпляр только такого типа! Пользовательские значения не допускаются. Более того, поскольку у нас есть только ограниченное количество экземпляров (статические экземпляры), автозаполнение предложит эти значения.

Еще одним преимуществом является то, что PossibleArgumentValue является классом, поэтому мы можем создавать методы или иметь более одного «получателя свойств».

Недостаток

Единственным недостатком этого является то, что экземпляры класса не являются «константами», поэтому их нельзя использовать, когда требуется константа, например, в качестве параметра атрибута.

Конечно, const может (и должен) использоваться как закрытое/защищенное значение внутри класса, если оно используется только этим классом. Конечно, есть и другие случаи, когда const следует использовать, но никогда не указывать в качестве параметра метода.