Что такое эквивалент финала 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 выражение оценивается в время работы, а не времени компиляции, следовательно, произвольного выражения.


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


чего здесь не хватает, так это гарантии 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# не может доставить эквивалент.


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

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


загерметизированная