¿Cuál es el equivalente de la final de Java en C #?

¿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.

Clases

Para evitar la creación de 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 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.

Variables

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.

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

  • En una constante (estática) definida en la statement, const puede considerarse 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, readonly 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 debe asignarse 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 similar. Al declararlo como definitivo, usted exige que se le asigne exactamente una vez; de lo contrario, se produce un error de comstackción. Esto requiere un código de buen comportamiento, por lo que hay menos errores.

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.

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

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

Intereting Posts