2011-01-06 11 views
58

Guardavo attraverso un codice C# per estendere il supporto linguistico in VS2010 (esempio Ook). Ho visto alcune classi chiamate internal sealed classChe cos'è una classe interna sigillata in C#?

Cosa fanno queste? Li userebbero?

Grazie

+10

Questo sarebbe un più domanda interessante se tu avessi chiesto "perché sigillarlo se lo fossi è già interno? " –

+0

@Hans Passant Forse impedire ad altri sviluppatori di estenderlo alla manutenzione o ad altri sviluppi futuri? (Triviale per rimuovere ovviamente, ma se la classe non funzionerebbe bene con molta eredità ha senso contrassegnarla come tale sigillandola – Kurru

+0

@Hans Passant - perché non consentire l'ereditarietà all'interno dell'assieme dato? Un sacco di scenari di utilizzo validi per una classe interna che può essere estesa in sottoclassi – dexter

risposta

125

È una classe che:

  • internal: si può accedere solo dall'interno del complesso è definito (o amico assiemi).
  • sealed: non può essere ereditato.

Le classi di marcatura come internal sono un modo per impedire agli utenti esterni di un assembly di utilizzarle. È davvero una forma di incapsulamento del design e IMHO è buona norma contrassegnare i tipi che non fanno parte dei modelli di oggetto pubblici/API previsti come internal. A lungo termine ciò impedisce agli utenti della tua libreria di accoppiarsi a tipi a cui non li hai intesi. Questo tipo di accoppiamento involontario danneggia la tua capacità di cambiare ed evolvere il modo in cui le tue librerie sono implementate in quanto non puoi cambiarle senza infrangere i tuoi clienti. L'utilizzo di internal aiuta a mantenere l'area di superficie pubblica e utilizzabile di una libreria su ciò che è destinato.

Le classi di marcatura come sealed impediscono che queste classi vengano ereditate.Questo è un intento di progettazione piuttosto drastico che a volte è utile se una classe è già così specializzata da rendere ragionevole il fatto che non sia necessario aggiungerne altre tramite ereditarietà direttamente o tramite l'override del suo comportamento.

internal e sealed modificare i tipi in modi diversi, ma possono essere utilizzati insieme.

NB avete qualche ulteriore controllo scoping di internal come si può definire una serie di altre assemblee come 'amici'. Questi gruppi di amici possono accedere ai tuoi tipi internal. Ciò può essere utile per definire insiemi di assiemi cooperanti come assiemi di produzione e test. È spesso auspicabile che un gruppo di test possa vedere tutti i tipi nell'assieme che sta testando.

+0

Ottima risposta Grazie mille –

+5

Alcuni sostengono che sigillato non è davvero "drastico" e dovrebbe essere considerato il default ... Ho visto Eric Lippert e Jon Skeet ne parla – Casey

+0

@Casey Non sono affatto d'accordo, credo addirittura che l'esplicita necessità di virtual sia drastica in C# e uno dei grandi svantaggi (forse l'unico grande) e il comportamento predefinito dovrebbe essere quello di consentire sempre l'estensibilità a meno che non sia esplicitamente proibito È molto più comune consentire il comportamento prevalente che non proibirlo – Arijoon

11

interno significa il membro è accessibile ad altri tipi definiti nello stesso assieme. Una classe Sealed è una sorta di opposizione di astratto. Può essere istanziato ma non può servire come classe base. La ragione principale per sigillare una classe è impedire agli utenti di giocherellare con essa e romperla. È anche il caso che sigillare una classe consente certe ottimizzazioni del compilatore che non sono possibili con classi non sigillate.

3

Internal significa che può essere utilizzato solo in stesso assembly,

La parola interna è un modificatore di accesso per tipi e membri tipo. tipi interni o membri sono accessibili solo all'interno di file nella stesso assieme

sealed che non può essere ereditata

Una classe chiusa non può essere ereditata. È l'errore di utilizzare una classe sigillata come classe base . Utilizzare il modificatore sigillato in una dichiarazione di classe per impedire l'ereditarietà della classe.

5

Una classe internal sealed è quella che è:

internal - Accessibile solo dall'interno della stessa assemblea
sealed - non può essere sottoclasse

In altre parole, non c'è modo per voi di usarlo direttamente.

13
  • interno: Una classe cui si può accedere solo all'interno dello stesso insieme.

    Assembly1.dll:

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

    Assembly2.dll:

    using test; 
    ... 
    InternalClass c1; // Error 
    PublicClass c2; // OK 
    
  • sigillato: Una classe che non può essere derivato da

    sealed class SealedClass { ... } 
    
    class ChildClass : SealedClass {} //ERROR 
    
Problemi correlati