Как уже было сказано, static final в Java совпадает с static readonly в C #. На самом деле, вы говорите, что этот член статический и его содержимое не может быть изменено. Также вы можете указать в обоих случаях значение из статического конструктора.
Но const в C # - это совсем другое. Это больше похоже на константы в C (директивы DEFINE ), но с учетом ООП. Это статично, потому что это константа - каждый экземпляр будет иметь эту константу с одинаковым значением, никакой конструктор не сможет ее установить. Также возможно, что кто-то хотел бы получить доступ к константе, не создавая экземпляр. Когда вы думаете об этом, нестатическая константа просто не имеет смысла. Вы можете почти сказать, что константы не являются частью объекта - они просто используют его для предоставления контекста, строгого имени.
Java не имеет эквивалента const . Вы можете где-нибудь прочитать, что static final эквивалентно DEFINE , но это так расплывчато. Абсолютно другой механизм, ничего общего, но в конечном итоге в коде то же самое - лучшая ремонтопригодность и читаемость кода.
Вам просто нужно перестать думать о константах в C # как о статических членах, потому что это не так. Думайте о них как оОП версия DEFINE . Когда вы рассматриваете инкапсуляцию, единственная причина, по которой поля final и readonly , состоит в том, чтобы предотвратить случайное изменение своего кода собственным значением. И мне это не кажется постоянным.
Sumary:
- final = только для чтения
- static final = static readonly
- N / A = const