2011-01-06 15 views
58

Estaba buscando un código C# para extender el soporte de idiomas en VS2010 (ejemplo de Ook). Vi algunas clases llamadas internal sealed class¿Qué es una clase interna sellada en C#?

¿Qué hacer? ¿Uno los usaría?

Gracias

+10

Esto sería una más pregunta interesante si hubieras preguntado "¿por qué sellar si yo s ya es interno? " –

+0

@ Hans Passant ¿Tal vez para evitar que otros desarrolladores lo extiendan en mantenimiento u otro desarrollo futuro? (Trivial para eliminar, por supuesto, pero si la clase no funcionaría bien con mucha herencia, tiene sentido marcar como tal al sellarla – Kurru

+0

@Hans Passant: ¿por qué no permitir la herencia dentro del ensamblaje dado solamente? Un montón de escenarios de uso válido para una clase interna que se puede extender en subclases. – dexter

Respuesta

125

Es una clase que:

  • internal: sólo se puede acceder desde dentro del conjunto se define (o conjuntos amigo).
  • sealed: No se puede heredar.

Clases de marcado como internal es una forma de evitar que los usuarios externos de un ensamblaje las usen. En realidad, es una forma de encapsulación de diseño. En mi humilde opinión, es una buena práctica marcar tipos que no forman parte de los modelos públicos de API \ objeto como internal. A largo plazo, esto impide que los usuarios de su biblioteca se relacionen con tipos que no pretendía. Este tipo de acoplamiento involuntario perjudica su capacidad de cambiar y evolucionar la forma en que se implementan sus bibliotecas, ya que no puede cambiarlas sin romper a sus clientes. El uso de internal ayuda a mantener el área de superficie pública y utilizable de una biblioteca a la altura deseada.

Las clases de marcado como sealed evitan que estas clases se hereden.Esta es una intención de diseño bastante drástica que a veces es útil si una clase ya es tan especializada que es razonable que no se le agregue ninguna otra funcionalidad a través de la herencia, ya sea directamente o anulando su comportamiento.

internal y sealed modifican tipos de maneras bastante diferentes, pero se pueden usar juntos.

NB tener algo de control de alcance adicional de internal como se puede definir un conjunto de otros montajes como 'amigos'. Estos ensamblados de amigos pueden acceder a sus tipos de internal. Esto puede ser útil para definir conjuntos de conjuntos cooperativos, como conjuntos de producción y prueba. A menudo es deseable que un ensamblaje de prueba pueda ver todos los tipos en el conjunto que está probando.

+0

Gran respuesta. Muchas gracias. –

+5

Algunos podrían argumentar que el sellado no es realmente "drástico" y debería considerarse el predeterminado ... He visto a Eric Lippert y Jon Skeet habla de esto. – Casey

+0

@Casey Estoy totalmente en desacuerdo. Incluso creo que la necesidad explícita de virtual es drástica en C# y una de las grandes desventajas (tal vez la única grande) y el comportamiento predeterminado debe ser siempre extensible a menos que esté explícitamente prohibido Es mucho más común permitir un comportamiento superior que prohibirlo. – Arijoon

11

interna significa el miembro es accesible para otros tipos que se definen en el mismo conjunto. Una clase Sellada es una especie de opuesto al resumen. Se puede instanciar pero no puede servir como una clase base. La razón principal para sellar una clase es evitar que los usuarios jueguen con ella y la rompan. También es cierto que el sellado de una clase permite ciertas optimizaciones del compilador que no son posibles con clases no selladas.

3

Internal significa que sólo se puede utilizar en mismo conjunto,

La palabra clave interna es un modificador de acceso para tipos y miembros de tipo. tipos internos o miembros son accesible sólo dentro de los archivos en el mismo conjunto

sealed que no puede ser heredada

Una clase cerrada no se puede heredar. Es es un error utilizar una clase sellada como una clase base . Use el modificador sellado en una declaración de clase para evitar la herencia de la clase .

5

Una clase internal sealed es uno que es:

internal - Sólo se puede acceder desde dentro del mismo conjunto
sealed - No se puede tener subclases

En otras palabras, no hay manera de que lo use directamente.

13
  • interna: una clase que sólo se puede acceder en el interior del mismo conjunto.

    Assembly1.dll:

    namespace test { 
        internal class InternalClass { 
        } 
    
        public class PublicClass { 
        } 
    } 
    

    Assembly2.dll:

    using test; 
    ... 
    InternalClass c1; // Error 
    PublicClass c2; // OK 
    
  • sellado: una clase que no se puede derivar de

    sealed class SealedClass { ... } 
    
    class ChildClass : SealedClass {} //ERROR 
    
Cuestiones relacionadas