2012-04-16 10 views
10

¿Alguien podría decirme que la razón por la cual el siguiente uso de sealed no compila? Mientras que, si reemplazo sealed con final y lo compilo como Java, funciona.C# sellado vs Java final

private sealed int compInt = 100; 
public bool check(int someInt) 
{ 
    if (someInt > compInt) 
    { 
     return true; 
    } 
    return false; 
} 
+0

http://stackoverflow.com/questions/2069010/is-there-any-functional-difference-between-c-sharp-sealed-and-javas-final-keywo –

+0

El equivalente a 'final' para miembros en C# es' readonly'. –

Respuesta

45

Eso es porque final en Java significa un montón de cosas diferentes dependiendo de donde vaya a utilizarlo mientras que en C# sealedse aplica solamente a clases y miembros potencialmente virtuales (métodos, propiedades, eventos).

En Java final se puede aplicar a:

  • clases, lo que significa que la clase no se puede heredar. Esto es el equivalente de C# sealed.
  • métodos, lo que significa que el método no puede anularse en una clase derivada. Este es el valor predeterminado en C#, a menos que declare un método como virtual y en una clase derivada esto se puede evitar para otras clases derivadas con sealed nuevamente.
  • campos y variables, lo que significa que solo se pueden inicializar una vez. Para los campos, el equivalente en C# es readonly.
+1

"sellado en C# se aplica solo a las clases" - no es cierto, se puede aplicar a los métodos en C#. – Maxim

2

Sealed en C# sólo puede aplicarse a un tipos de referencia, y tiene un impacto en el árbol de herencia .

En la práctica, el tipo marcado como sealed garantizado para ser la última "hoja" en el árbol de herencia, o en resumen, no puede derivar del tipo declarado como sealed.

public sealed class Child : Base 
{ 
} 

public class AnotherAgain : Child //THIS IS NOT ALLOWED 
{ 
} 

No se puede aplicar a un miembro.

2

La respuesta de Tigran no está mal mientras que la de Joey es un poco incorrecta.
En primer lugar, puede mirar en esta página: What is the equivalent of Java's final in C#?.
la palabra clave sealed se puede aplicar a class, instance method y property pero no a las variables ni a los métodos de la interfaz. Las clases con sealed no se pueden heredar. Cuando sealed pone en el método, debe ser por override en compañía. Cada struct es sealed, por lo que struct no se puede heredar. Compruebe esta imagen: sealed usage