Что эквивалентно финалу Java в C #?

507

Что такое эквивалент Java final в С#?

  • 127
    Комментарий в верхней части класса: «Если вы переопределите этот класс, вы уволены!» (Конечно, это шутка :)
Теги:
reserved-words
access-modifiers

8 ответов

834
Лучший ответ

Ключевое слово 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 выражение оценивается во время выполнения, а не во время компиляции, следовательно, позволяет произвольные выражения.

  • 14
    Я бы добавил, что все нестатические методы в Java являются виртуальными по умолчанию. Таким образом, хотя в C # вы можете просто не указывать виртуальное в первоначальном определении, вам нужно будет использовать «final», чтобы избежать переопределения его подклассами в Java.
  • 154
    хороший ответ - есть еще одно использование «final» в java - для локальной переменной или параметра метода, чтобы предотвратить его переназначение. Там нет C # прямой эквивалент этого.
Показать ещё 7 комментариев
152

Это зависит от контекста.

  • Для класса или метода final эквивалент С# sealed.
  • Для поля final эквивалент С# readonly.
  • Для параметра локальной переменной или метода final нет прямого эквивалента С#.
  • 1
    На самом деле не требуется, чтобы конечная переменная была назначена при ее объявлении. 'final' означает, что переменная должна быть назначена некоторым путем кода, прежде чем на нее будет ссылаться, и ни один путь кода не позволяет назначать переменную более одного раза. Это относится к переменным экземпляра, что фактически означает, что конструкторы должны назначить переменную явно.
  • 22
    + for 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 Огромное различие.
Показать ещё 3 комментария
39

То, что здесь не хватает, - это Java-гарантия определенного назначения для конечных переменных-членов.

Для класса C с конечной переменной-членом V каждый возможный путь выполнения через каждый конструктор C должен назначать V ровно один раз - неспособность назначить V или присвоение V два или более раз приведет к ошибке.

Ключевое слово С# для чтения не имеет такой гарантии - компилятор более чем счастлив оставить ненасыщенные члены readonly или позволить вам назначать их несколько раз внутри конструктора.

Итак, final и readonly (по крайней мере, по отношению к переменным-членам), безусловно, не эквивалентны - final гораздо более строгий.

6

Окончательный класс Java и окончательный метод → запечатанный. Java member variable final → readonly для константы времени выполнения, const для постоянной времени компиляции.

Нет эквивалента для окончательной окончательной окончательной версии и аргумента метода

5

Как уже упоминалось, sealed эквивалент final для методов и классов.

Что касается остальных, то это сложно.

  • На константе (статической), определенной в объявлении, const можно считать эквивалентом, при условии, что это примитивный тип или неизменяемый класс.
  • В поле, которое не следует переназначать, когда оно покидает конструктор, можно использовать readonly, но оно не равно - final требует ровно одного присваивания даже в конструкторе.
  • Локальная переменная, которая должна быть назначена только один раз, не может быть создана на С#, я полагаю. Если вам интересно, зачем кому-то это нужно: вы можете объявить переменную до некоторого if-else, switch-case или так. Объявляя его окончательным, вы обеспечиваете, чтобы ему назначалось ровно один раз, если нет, произошла ошибка компилятора. Это требует хорошего поведения кода, поэтому ошибок меньше.

Суммированный, С# не имеет прямого эквивалента final. В то время как Java не обладает некоторыми хорошими функциями С#, для меня это обновляется, как в основном программист Java, чтобы увидеть, где С# не может предоставить эквивалент.

4

http://en.csharp-online.net/CSharp_FAQ:_What_are_the_differences_between_CSharp_and_Java_constant_declarations

Константы С# объявляются с использованием ключевого слова const для констант времени компиляции или ключевого слова readonly для констант времени выполнения. Семантика констант одинакова на языках С# и Java.

0

опечатано

  • 8
    Это только часть ответа, так как он зависит от контекста и добавления объяснений и / или примеров, которые сделают его более понятным для тех, кто нуждается в помощи
-3

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню