¿Cuál es el equivalente de la final
de Java en C #?
La palabra clave final
tiene varios usos en Java. Corresponde a las palabras clave sealed
y de readonly
en C #, según el contexto en el que se utiliza.
Para evitar la creación de subclases (herencia de la clase definida):
Java
public final class MyFinalClass {...}
DO#
public sealed class MyFinalClass {...}
Evitar la anulación de un método virtual
.
Java
public class MyClass { public final void myFinalMethod() {...} }
DO#
public class MyClass : MyBaseClass { public sealed override void MyFinalMethod() {...} }
Como señala Joachim Sauer, una diferencia notable entre los dos idiomas es que Java marca por defecto todos los métodos no estáticos como virtual
, mientras que C # los marca como sealed
. Por lo tanto, solo necesita usar la palabra clave sealed
en C # si desea detener la sobrescritura de un método que se ha marcado explícitamente como virtual
en la clase base.
Para permitir que una variable se asigne una sola vez:
Java
public final double pi = 3.14; // essentially a constant
DO#
public readonly double pi = 3.14; // essentially a constant
Como nota al margen, el efecto de la palabra clave readonly
difiere del de la palabra clave const
en que la expresión readonly
se evalúa en tiempo de ejecución en lugar de en tiempo de comstackción , permitiendo expresiones arbitrarias.
Depende del contexto.
final
, el equivalente de C # está sealed
. final
, el equivalente de C # es de readonly
. final
, no hay un equivalente directo de C #. Lo que falta a todos aquí es la garantía de Java de una asignación definitiva para las variables finales de los miembros.
Para una clase C con la variable de miembro final V, cada ruta de ejecución posible a través de cada constructor de C debe asignar V exactamente una vez; si no se asigna V o se asigna V dos o más veces, se producirá un error.
La palabra clave de solo lectura de C # no tiene tal garantía: el comstackdor está más que feliz de dejar sin leer los miembros de solo lectura o de permitirle asignarlos múltiples veces dentro de un constructor.
Entonces, final y de solo lectura (al menos con respecto a las variables de miembro) definitivamente no son equivalentes, el final es mucho más estricto.
Final de la clase Java y método final -> sellado. Variable miembro de Java final -> readonly para la constante de tiempo de ejecución, const para la constante de tiempo de comstackción.
No hay equivalente para final de variable local y argumento de método final
Como se mencionó, sealed
es un equivalente de final
para métodos y clases.
En cuanto al rest, es complicado.
const
puede considerarse equivalente, siempre que sea un tipo primitivo o una clase inmutable. readonly
se puede usar readonly
, pero no es igual; el final
requiere exactamente una asignación incluso en el constructor. En resumen, C # no tiene equivalente directo de final
. Si bien Java carece de algunas características agradables de C #, me resulta refrescante, en su mayor parte como progtwigdor de Java, ver dónde C # no entrega un equivalente.
Las constantes de C # se declaran utilizando la palabra clave const para las constantes de tiempo de comstackción o la palabra clave readonly para las constantes de tiempo de ejecución. La semántica de las constantes es la misma en los lenguajes C # y Java.
sellado