Что такое эквивалент Java final
в С#?
Что такое эквивалент Java final в С#?
Ответ 1
Ключевое слово final
имеет несколько применений в Java. Он соответствует как sealed
и readonly
ключевые слова в С#, в зависимости от контекста, в котором он используется.
Классы
Чтобы предотвратить подкласс (наследование из определенного класса):
Java
public final class MyFinalClass {...}
С#
public sealed class MyFinalClass {...}
Методы
Предотвращение переопределения метода virtual
.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
С#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Как отмечает Йоахим Зауэр, заметная разница между этими двумя языками здесь заключается в том, что Java по умолчанию отмечает все нестатические методы как virtual
, тогда как С# обозначает их как sealed
. Следовательно, вам нужно использовать ключевое слово sealed
в С#, если вы хотите остановить дальнейшее переопределение метода, который был явно помечен virtual
в базовом классе.
Переменные
Чтобы разрешить только одну переменную:
Java
public final double pi = 3.14; // essentially a constant
С#
public readonly double pi = 3.14; // essentially a constant
В качестве побочного примечания эффект ключевого слова readonly
отличается от ключевого слова const
тем, что readonly
выражение оценивается во время выполнения, а не во время компиляции, следовательно, позволяет произвольные выражения.
Ответ 2
Это зависит от контекста.
- Для класса или метода
final
эквивалент С#sealed
. - Для поля
final
эквивалент С#readonly
. - Для параметра локальной переменной или метода
final
нет прямого эквивалента С#.
Ответ 3
То, что здесь не хватает, - это Java-гарантия определенного назначения для конечных переменных-членов.
Для класса C с конечной переменной-членом V каждый возможный путь выполнения через каждый конструктор C должен назначать V ровно один раз - неспособность назначить V или присвоение V два или более раз приведет к ошибке.
Ключевое слово С# для чтения не имеет такой гарантии - компилятор более чем счастлив оставить ненасыщенные члены readonly или позволить вам назначать их несколько раз внутри конструктора.
Итак, final и readonly (по крайней мере, по отношению к переменным-членам), безусловно, не эквивалентны - final гораздо более строгий.
Ответ 4
Окончательный класс Java и окончательный метод → запечатанный. Java member variable final → readonly для константы времени выполнения, const для постоянной времени компиляции.
Нет эквивалента для окончательной окончательной окончательной версии и аргумента метода
Ответ 5
Как уже упоминалось, sealed
эквивалент final
для методов и классов.
Что касается остальных, то это сложно.
- На константе (статической), определенной в объявлении,
const
можно считать эквивалентом, при условии, что это примитивный тип или неизменяемый класс. - В поле, которое не следует переназначать, когда оно покидает конструктор, можно использовать
readonly
, но оно не равно -final
требует ровно одного присваивания даже в конструкторе. - Локальная переменная, которая должна быть назначена только один раз, не может быть создана на С#, я полагаю. Если вам интересно, зачем кому-то это нужно: вы можете объявить переменную до некоторого if-else, switch-case или так. Объявляя его окончательным, вы обеспечиваете, чтобы ему назначалось ровно один раз, если нет, произошла ошибка компилятора. Это требует хорошего поведения кода, поэтому ошибок меньше.
Суммированный, С# не имеет прямого эквивалента final
. В то время как Java не обладает некоторыми хорошими функциями С#, для меня это обновляется, как в основном программист Java, чтобы увидеть, где С# не может предоставить эквивалент.
Ответ 6
Константы С# объявляются с использованием ключевого слова const для констант времени компиляции или ключевого слова readonly для констант времени выполнения. Семантика констант одинакова на языках С# и Java.
Ответ 7
опечатано
Ответ 8
"запечатанный и readonly" не может использоваться для переменных. Для переменных используйте ключевое слово const
, чтобы получить эквивалентный эффект.