Что такое эквивалент Java final
в С#?
Ключевое слово 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
выражение оценивается во время выполнения, а не во время компиляции, следовательно, позволяет произвольные выражения.
Это зависит от контекста.
final
эквивалент С# sealed
.final
эквивалент С# readonly
.final
нет прямого эквивалента С#.For a final local variable or method parameter, there's no direct C# equivalent
в For a final local variable or method parameter, there's no direct C# equivalent
Огромное различие.
То, что здесь не хватает, - это Java-гарантия определенного назначения для конечных переменных-членов.
Для класса C с конечной переменной-членом V каждый возможный путь выполнения через каждый конструктор C должен назначать V ровно один раз - неспособность назначить V или присвоение V два или более раз приведет к ошибке.
Ключевое слово С# для чтения не имеет такой гарантии - компилятор более чем счастлив оставить ненасыщенные члены readonly или позволить вам назначать их несколько раз внутри конструктора.
Итак, final и readonly (по крайней мере, по отношению к переменным-членам), безусловно, не эквивалентны - final гораздо более строгий.
Окончательный класс Java и окончательный метод → запечатанный. Java member variable final → readonly для константы времени выполнения, const для постоянной времени компиляции.
Нет эквивалента для окончательной окончательной окончательной версии и аргумента метода
Как уже упоминалось, sealed
эквивалент final
для методов и классов.
Что касается остальных, то это сложно.
const
можно считать эквивалентом, при условии, что это примитивный тип или неизменяемый класс.readonly
, но оно не равно - final
требует ровно одного присваивания даже в конструкторе. Суммированный, С# не имеет прямого эквивалента final
. В то время как Java не обладает некоторыми хорошими функциями С#, для меня это обновляется, как в основном программист Java, чтобы увидеть, где С# не может предоставить эквивалент.
Константы С# объявляются с использованием ключевого слова const для констант времени компиляции или ключевого слова readonly для констант времени выполнения. Семантика констант одинакова на языках С# и Java.
опечатано
"запечатанный и readonly" не может использоваться для переменных. Для переменных используйте ключевое слово const
, чтобы получить эквивалентный эффект.