Что такое эквивалент финала 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.