Что такое эквивалент 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, чтобы увидеть, где С# не может предоставить эквивалент.

Ответ 7

опечатано

Ответ 8

"запечатанный и readonly" не может использоваться для переменных. Для переменных используйте ключевое слово const, чтобы получить эквивалентный эффект.