Что эквивалентно Java final
в C #?
c#
access-modifiers
reserved-words
Nosrama
источник
источник
Ответы:
final
Ключевое слово имеет несколько использований в Java. Это соответствует какsealed
иreadonly
ключевым словам в C #, в зависимости от контекста , в котором она используется.Классы
Чтобы предотвратить создание подклассов (наследование от определенного класса):
Ява
C #
методы
Предотвратить переопределение
virtual
метода.Ява
C #
Как отмечает Joachim Sauer, заметное различие между этими двумя языками заключается в том, что Java по умолчанию помечает все нестатические методы как
virtual
, тогда как C # помечает их какsealed
. Следовательно, вам нужно использоватьsealed
ключевое слово в C # только в том случае, если вы хотите прекратить дальнейшее переопределение метода, который был явно отмеченvirtual
в базовом классе.переменные
Чтобы разрешить присвоение переменной только один раз:
Ява
C #
Как примечание, эффект
readonly
ключевого слова отличается от эффекта ключевогоconst
слова тем, чтоreadonly
выражение вычисляется во время выполнения, а не во время компиляции , следовательно, допускает произвольные выражения.источник
readonly
переменные-члены могут быть изменены в конструкторах: pastebin.com/AzqzYGiAЭто зависит от контекста.
final
класса или метода эквивалент C # равенsealed
.final
поля эквивалент C #readonly
.final
локальной переменной или параметра метода не существует прямого эквивалента в C #.источник
For a final local variable or method parameter, there's no direct C# equivalent
огромное различие.const
может использоваться только для типов значений. Насколько я знаю, нет способа создать эффективную константу для локального ссылочного типа.Чего здесь не хватает, так это гарантии Java определенного присваивания конечных переменных-членов.
Для класса C с конечной переменной-членом V каждый возможный путь выполнения через каждый конструктор C должен назначать V ровно один раз - если не назначить V или назначить V два или более раз, это приведет к ошибке.
Ключевое слово readonly в C # не дает такой гарантии - компилятор будет рад оставить элементы readonly неназначенными или позволить вам назначать их несколько раз в конструкторе.
Таким образом, final и readonly (по крайней мере, в отношении переменных-членов) определенно не эквивалентны - final намного строже.
источник
Как уже упоминалось,
sealed
является эквивалентомfinal
для методов и классов.В остальном все сложно.
Для
static final
полейstatic readonly
это самая близкая вещь возможная. Это позволяет вам инициализировать статическое поле в статическом конструкторе, который довольно похож на статический инициализатор в Java. Это относится как к константам (примитивам и неизменным объектам), так и к константным ссылкам на изменяемые объекты.const
Модификатор очень похож на константы, но вы не можете установить их в статическом конструкторе.readonly
Можно использовать поле, которое не следует переназначать после выхода из конструктора . Это не равно, хотя -final
требует ровно одного присваивания даже в конструкторе или инициализаторе.Не существует эквивалента C # для
final
локальной переменной, о которой я знаю. Если вам интересно, зачем кому-то это нужно: вы можете объявить переменную до if-else, switch-case или около того. Объявив его окончательным, вы обязуетесь назначить его не более одного раза.Локальные переменные Java в общем случае должны быть назначены хотя бы один раз перед их чтением. Если ветвь не выскакивает до считывания значения, окончательная переменная назначается ровно один раз. Все это проверено во время компиляции. Это требует хорошего поведения кода с меньшим запасом на ошибку.
Подводя итог, C # не имеет прямого эквивалента
final
. Хотя в Java отсутствуют некоторые приятные возможности C #, мне, как программисту на Java, очень приятно видеть, где C # не может предоставить эквивалент.источник
Класс Java final и метод final -> загерметизированы. Переменная-член Java final -> readonly для постоянной времени выполнения, const для постоянной времени компиляции.
Нет эквивалента для локальной переменной final и метода final
источник
http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations
Константы C # объявляются с использованием ключевого слова const для констант времени компиляции или ключевого слова readonly для констант времени выполнения. Семантика констант одинакова как в языках C #, так и в языках Java.
источник
запечатанный
источник