web-dev-qa-db-fra.com

Qu'est-ce qu'une classe interne scellée en C #?

Je cherchais du code C # pour étendre la prise en charge des langues dans VS2010 (exemple Ook). J'ai vu des cours appelés internal sealed class

Que font-ils? Les utiliserait-on?

63
Byron Whitlock

C'est une classe qui:

  • internal: accessible uniquement depuis l'assembly défini (ou les assemblys amis).
  • sealed: Ne peut pas être hérité.

Le marquage des classes comme internal est un moyen d'empêcher les utilisateurs externes d'un assembly de les utiliser. Il s'agit en fait d'une forme d'encapsulation de conception et à mon humble avis, il est recommandé de marquer les types qui ne font pas partie des modèles API\objet publics prévus comme internal. À long terme, cela empêche les utilisateurs de votre bibliothèque de se coupler à des types auxquels vous ne les vouliez pas. Ce type de couplage involontaire nuit à votre capacité à changer et à faire évoluer la façon dont vos bibliothèques sont implémentées car vous ne pouvez pas les changer sans casser vos clients. L'utilisation de internal permet de limiter la surface publique et utilisable d'une bibliothèque à ce qui est prévu.

Le marquage des classes comme sealed empêche l'héritage de ces classes. Il s'agit d'une intention de conception assez drastique qui est parfois utile si une classe est déjà si spécialisée qu'il est judicieux de ne lui ajouter aucune autre fonctionnalité via l'héritage soit directement, soit en remplaçant son comportement.

internal et sealed modifient les types de manières très différentes, mais ils peuvent être utilisés ensemble.

NB Vous avez un contrôle supplémentaire de la portée de internal car vous pouvez définir un ensemble d'autres assemblys comme 'copains'. Ces assemblys amis peuvent accéder à vos types internal. Cela peut être utile pour définir des ensembles d'assemblages coopérants tels que des assemblages de production et de test. Il est souvent souhaitable qu'un assembly de test puisse voir tous les types dans l'assembly qu'il teste.

139
Tim Lloyd
  • internal: classe accessible uniquement à l'intérieur du même assembly.

    Assembly1.dll:

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

    Assembly2.dll:

    using test;
    ...
    InternalClass c1; // Error
    PublicClass c2; // OK
    
  • scellé: une classe qui ne peut pas être dérivée de

    sealed class SealedClass { ... }
    
    class ChildClass : SealedClass {} //ERROR
    
16
HyLian

Interne signifie que le membre est accessible à d'autres types définis dans le même assembly. Une classe scellée est en quelque sorte l'opposé de l'abstrait. Il peut être instancié mais ne peut pas servir de classe de base. La principale raison de sceller une classe est d'empêcher vos utilisateurs de la tripoter et de la casser. Il est également vrai que le scellage d'une classe permet certaines optimisations du compilateur qui ne sont pas possibles avec les classes non scellées.

11
HABJAN

Un internal sealed classe est celle qui est:

internal - accessible uniquement depuis le même assembly
sealed - Ne peut pas être sous-classé

En d'autres termes, vous ne pouvez pas l'utiliser directement.

5
Powerlord

interne signifie qu'il ne peut être utilisé que dans le même assemblage,

Le mot clé interne est un modificateur d'accès pour les types et les membres de type. Les types ou membres internes sont accessibles uniquement dans les fichiers du même assembly

scellé qui ne peut pas être hérité

Une classe scellée ne peut pas être héritée. C'est une erreur d'utiliser une classe scellée comme classe de base. Utilisez le modificateur scellé dans une déclaration de classe pour empêcher l'héritage de la classe.

4
Arsen Mkrtchyan