Что такое эквивалент финала Java в C#?
что такое эквивалент Java final
в C#?
7 ответов
на 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
выражение оценивается в время работы, а не времени компиляции, следовательно, произвольного выражения.
Это зависит от контекста.
- на
final
класс или метод,эквивалент C# -sealed
. - на
чего здесь не хватает, так это гарантии Java определенного назначения для конечных переменных-членов.
для класса C с конечной переменной-членом V каждый возможный путь выполнения через каждый конструктор C должен назначить V ровно один раз-неспособность назначить V или назначить V два или более раз приведет к ошибке.
ключевое слово c#readonly не имеет такой гарантии-компилятор более чем счастлив оставить члены readonly неназначенными или позволить вам назначить их несколько раз в конструкторе.
Итак, final и readonly (по крайней мере, в отношении переменных - членов) определенно не эквивалентны-final намного строже.
Java Class final и метод final - > sealed. Переменная-член Java final - > readonly для константы времени выполнения, const для константы времени компиляции.
нет эквивалента для локальной переменной final и аргумента метода final
как уже упоминалось, sealed
является эквивалентом final
для методов и классов.
что касается остального, это сложно.
- на (статической) константе, определенной в объявлении,
const
можно считать эквивалентом при условии, что это примитивный тип или неизменяемый класс. - в поле, которое не должно быть переназначено после выхода из конструктора,
readonly
можно использовать, но это не равно -final
требуется ровно одно задание даже в конструкторах. - локальная переменная, которая должна быть назначена только один раз не может быть создан в C#, я предполагаю. Если вам интересно, зачем это кому-то нужно: вы можете объявить переменную до некоторого if-else, switch-case или так. Объявив его окончательным, вы обеспечиваете, чтобы он был назначен ровно один раз, если нет, происходит ошибка компилятора. Это требует хорошего поведения кода, поэтому ошибок меньше.
суммировано, C# не имеет прямого эквивалента final
. Хотя Java не хватает некоторых приятных функций C#, для меня, как в основном программиста Java, освежает, чтобы увидеть, где C# не может доставить эквивалент.
константы C# объявляются с помощью ключевого слова const для констант времени компиляции или ключевого слова readonly для констант времени выполнения. Семантика констант одинакова как в языках C#, так и в Java.