Pregunta

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

¿Fue útil?

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.

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

    Se requieren

    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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top