¿Cuál es el equivalente del final de Java en C#?
-
19-09-2019 - |
Pregunta
¿Cuál es el equivalente de Java? final
Cª#?
Solución
El final
palabra clave tiene varios usos en Java. Se corresponde tanto a la sealed
y palabras clave readonly
en C #, dependiendo del contexto en el que se utiliza.
clases
Para evitar subclases (herencia de la clase definida):
Java
public final class MyFinalClass {...}
C #
public sealed class MyFinalClass {...}
Métodos
Prevent primordial de un método virtual
.
Java
public class MyClass
{
public final void myFinalMethod() {...}
}
C #
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
Como Joachim Sauer señala, una diferencia notable entre los dos lenguajes Java aquí es que por las marcas por defecto todos los métodos no estáticos como virtual
, mientras que C # los marca como sealed
. Por lo tanto, sólo es necesario utilizar la palabra clave sealed
en C # si desea detener aún más primordial de un método que se ha marcado explícitamente virtual
en la clase base.
Variables
para permitir sólo una variable para asignar una vez:
Java
public final double pi = 3.14; // essentially a constant
C #
public readonly double pi = 3.14; // essentially a constant
Como nota al margen, el efecto de la palabra clave readonly
difiere de la de la const
palabra clave en la que la expresión readonly
se evalúa a runtime en lugar de tiempo de compilación , por lo tanto permitiendo expresiones arbitrarias.
Otros consejos
Depende del contexto.
- Para una clase
final
o método, el C # equivalente essealed
. - Para un campo
final
, la C # equivalente esreadonly
. - Para una variable local
final
o parámetro del método, no hay directa C # equivalente.
Lo que todos aquí faltan es la garantía de Java de asignación definitiva para las variables miembro finales.
Para una clase C con variable miembro final V, cada ruta de ejecución posible a través de cada constructor de C debe asignar V exactamente una vez; no asignar V o asignar V dos o más veces resultará en un error.
La palabra clave readonly de C# no tiene tal garantía: el compilador está más que feliz de dejar miembros de solo lectura sin asignar o permitirle asignarlos varias veces dentro de un constructor.
Por lo tanto, final y de solo lectura (al menos con respecto a las variables miembro) definitivamente no son equivalentes: final es mucho más estricto.
Como se ha mencionado, sealed
es un equivalente de final
para los métodos y clases.
En cuanto al resto, es complicado.
-
Para los campos
static final
,static readonly
es lo más parecido posible. Se le permite inicializar el campo estático en un constructor estático, que es bastante similar al inicializador estático en Java. Esto se aplica tanto a las constantes (primitivas y objetos inmutables) y constantes referencias a objetos mutables.El modificador
const
es bastante similar para las constantes, pero no se puede establecer en un constructor estático. - En un campo que no debe ser reasignado una vez que sale el constructor,
readonly
se puede utilizar. No es igual, aunque -.final
requiere exactamente una asignación incluso en el constructor o el inicializador -
No hay equivalente C # para un
Se requierenfinal
variable local, que yo sepa. Si se está preguntando ¿por qué alguien lo necesita: Se puede declarar una variable antes de un switch de los casos más o menos. Declarándolo final, se fuerza que se le asigna como máximo una vez.Java variables locales en general a asignarse al menos una vez antes de que se leen. Menos que el grupo salta a la vista antes de valor de lectura, una última variable se le asigna exactamente una vez. Todo esto se comprueba en tiempo de compilación. Esto requiere comporta bien código con menos margen para un error.
Resumirse, C # no tiene equivalente directo de final
. Mientras Java carece de algunas características de C #, es refrescante para mí como todo un programador de Java para ver donde C # no puede entregar un equivalente.
clase Java final y último método -> sellado. miembro de java última variable -.> de sólo lectura para constantes de tiempo de ejecución, const para la constante de tiempo de compilación
No hay equivalente para la discusión final y método de variable local final
C # constantes se declaran usando la palabra clave const para constantes de tiempo de compilación o la palabra clave de sólo lectura para las constantes de tiempo de ejecución. La semántica de las constantes es el mismo tanto en el C # y lenguajes Java.
sellado