sharp que programacion lenguaje historia caracteristicas c# access-modifiers reserved-words

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: el final 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.


Depende del contexto.

  • Para una clase o método final , el sealed .
  • Para un campo final , el readonly .
  • Para una variable local final o parámetro de método, no hay un equivalente directo de 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.

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