que - lenguaje de programacion c# caracteristicas
¿Cuál es el equivalente de la final de Java en C#? (7)
¿Cuál es el equivalente de la final
de Java en C #?
Clase de Java final y método final -> sellado. Variable miembro de Java final -> readonly para constante de tiempo de ejecución, const para constante de tiempo de compilación.
No hay equivalente para final de variable local y argumento final de método.
Como se mencionó, sealed
es un equivalente de final
para métodos y clases.
En cuanto al resto, es complicado.
- En una constante (estática) definida en la declaración,
const
puede considerarse un equivalente, siempre que sea un tipo primitivo o una clase inmutable. - En un campo que no debe ser reasignado una vez que abandona el constructor, se puede usar
readonly
, pero no es igual: elfinal
requiere exactamente una asignación incluso en el constructor. - Una variable local que se supone que se asigna solo una vez no se puede crear en C #, supongo. Si se está preguntando por qué alguien lo necesitaría: puede declarar una variable antes de algún if-else, switch-case o algo así. Al declararlo como final, obliga a que se asigne exactamente una vez; de lo contrario, se produce un error de compilación. Esto requiere un código de buen comportamiento, por lo que hay menos errores.
Resumido, C # no tiene equivalente directo de final
. Si bien Java carece de algunas características agradables de C #, es refrescante para mí, en su mayoría como programador de Java, para ver dónde C # no entrega un equivalente.
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.
Las clases
Para evitar subclases (herencia de la clase definida):
Java
public final class MyFinalClass {...}
DO#
public sealed class MyFinalClass {...}
Métodos
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 aquí 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 el reemplazo adicional de un método que se ha marcado explícitamente como virtual
en la clase base.
Variables
Para permitir solo que una variable sea asignada una 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 compilación , lo que permite expresiones arbitrarias.
Lo que todos faltan aquí es la garantía de Java de asignación definitiva para las variables de miembro final.
Para una clase C con la variable miembro final V, cada ruta de ejecución posible a través de cada constructor de C debe asignar V exactamente una vez; al no asignar V o asignar V dos o más veces, se producirá un error.
La palabra clave de solo lectura de C # no tiene tal garantía: el compilador está más que feliz de dejar a los miembros de solo lectura sin asignar o le permite asignarlos varias veces dentro de un constructor.
Entonces, final y de solo lectura (al menos con respecto a las variables de los miembros) definitivamente no son equivalentes, la final es mucho más estricta.
sellado
Las constantes de C # se declaran usando la palabra clave const para las constantes de tiempo de compilació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.