Что эквивалентно финалу Java в C #? - PullRequest
530 голосов
/ 25 августа 2009

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

Ответы [ 7 ]

824 голосов
/ 25 августа 2009

Ключевое слово final имеет несколько применений в Java. Он соответствует ключевым словам sealed и readonly в C #, в зависимости от контекста, в котором он используется.

Классы

Чтобы предотвратить создание подклассов (наследование от определенного класса):

Java

public final class MyFinalClass {...}

C #

public sealed class MyFinalClass {...}

Методы

Предотвращение переопределения метода virtual.

Java

public class MyClass
{
    public final void myFinalMethod() {...}
}

C #

public class MyClass : MyBaseClass
{
    public sealed override void MyFinalMethod() {...}
}

Как отмечает Йоахим Зауэр, заметное различие между этими двумя языками заключается в том, что Java по умолчанию помечает все нестатические методы как virtual, тогда как C # помечает их как sealed. Следовательно, вам нужно использовать ключевое слово sealed в C # только в том случае, если вы хотите прекратить дальнейшее переопределение метода, который был явно помечен virtual в базовом классе.

Переменные

Чтобы разрешить присвоение переменной только один раз:

Java

public final double pi = 3.14; // essentially a constant

C #

public readonly double pi = 3.14; // essentially a constant

В качестве дополнительного примечания эффект ключевого слова readonly отличается от эффекта ключевого слова const тем, что выражение readonly оценивается в время выполнения , а не время компиляции , что позволяет использовать произвольные выражения.

168 голосов
/ 25 августа 2009

Зависит от контекста.

  • Для класса или метода final эквивалент C # равен sealed.
  • Для поля final эквивалент C # равен readonly.
  • Для локальной переменной final или параметра метода прямой эквивалент C # отсутствует.
41 голосов
/ 07 мая 2010

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

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

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

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

7 голосов
/ 19 февраля 2015

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

А в остальном все сложно.

  • Для полей static final, static readonly - самая близкая вещь, возможная. Это позволяет вам инициализировать статическое поле в статическом конструкторе, который довольно похож на статический инициализатор в Java. Это относится как к константам (примитивам и неизменным объектам), так и к константным ссылкам на изменяемые объекты.

    Модификатор const очень похож на константы, но вы не можете установить их в статическом конструкторе.

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

    Локальные переменные Java в общем случае должны быть назначены хотя бы один раз перед их чтением. Если ветвь не выскакивает до считывания значения, окончательная переменная назначается ровно один раз. Все это проверено во время компиляции. Для этого требуется корректный код с меньшим запасом на ошибку.

Подводя итог, C # не имеет прямого эквивалента final. Хотя в Java отсутствуют некоторые приятные возможности C #, мне, как программисту на Java, очень приятно видеть, где C # не может предоставить эквивалент.

6 голосов
/ 25 августа 2009

Java класс final и метод final -> запечатаны. Переменная-член Java final -> readonly для постоянной времени выполнения, const для постоянной времени компиляции.

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

5 голосов
/ 25 августа 2009

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

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

0 голосов
/ 25 августа 2009

запечатано

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...