2013-05-11 14 views
11

Ho visto alcuni di codice C# che dichiara una classe con una internal modificatore, con un public costruttore:cosa fa un costruttore pubblico su una classe interna significa

internal class SomeClass 
{ 
    public SomeClass() 
    { 
    } 
} 

Qual è il punto di avere un costruttore pubblico , se la visibilità dell'intera classe è interna, quindi può essere vista solo all'interno dell'assieme di definizione?

Inoltre, questo ha senso nel caso SomeClass è una classe nidificata?

+2

Se si crea un UserControl interno con un costruttore interno, la finestra di progettazione di Win Form si comporterebbe in modo anomalo. – DaveShaw

+1

Pensa al modificatore di accesso sulla classe come a una sorta di "interruttore principale" che imposta l'accessibilità * massima * di tutti i membri della classe. –

+0

@ChrisMcGrath. In generale, sarei d'accordo, anche se questa domanda fa anche domande sulla nidificazione delle classi (e l'ho perso durante la mia prima lettura, quindi l'ho affrontata in una modifica alla mia risposta). –

risposta

14

La portata internal class sostituisce il costruttore portata public MyClass(), rendendo il costruttore internal.

L'utilizzo di public nel costruttore semplifica l'aggiornamento della classe a public in seguito, ma confonde l'intento. Io non lo faccio

Modifica 3: ho perso parte della domanda. Va ancora bene farlo se la tua classe è annidata. L'annidamento non può fare alcuna differenza, anche se è annidato in una classe privata in una classe pubblica in un ... (vedi C# language specification - 3.5.2 Accessibility domains).

EDIT: E, se ricordo, se ctor è internal, non può essere usato come un tipo generico in cui v'è un vincolo che richiede where T : new(), ciò richiederebbe un public costruttore (. Ref C# language specification (version 4.0) - 4.4.3 Bound and unbound types) .

Edit 2: Esempio di codice dimostrando quanto sopra

class Program 
{ 
    internal class InternalClass { 
     internal InternalClass() { } 
    } 
    internal class InternalClassPublicCtor { 
     public InternalClassPublicCtor() { }   
    } 
    internal class GenericClass<T> 
     where T : new() {} 

    static void Main(string[] args) { 
     GenericClass<InternalClass> doesNotCompile = new GenericClass<InternalClass>(); 
     GenericClass<InternalClassPublicCtor> doesCompile = new GenericClass<InternalClassPublicCtor>(); 
    } 
} 
+0

sono della stessa idea su intenti confusi a meno che tu non abbia molti costruttori, non dovrebbe essere troppo difficile cambiare i tuoi costruttori in pubblico dopo un aggiornamento e molti strumenti di refactoring suggeriranno anche questo –

0

La parola chiave interna è un modificatore di accesso per tipi e membri di tipo. I membri interni sono accessibili solo all'interno di file nello stesso assembly.

Esempio: Microsoft internal modifier

+0

Ma la domanda non ha chiesto cosa fa il modificatore interno ...? –

6

Da MSDN - Access Modifiers (C# Programming Guide):

Normalmente, l'accessibilità dell'utente è non maggiore della accessibilità del tipo che lo contiene. Tuttavia, un membro pubblico di una classe interna potrebbe essere accessibile dall'esterno dell'assembly se il membro implementa metodi di interfaccia o esegue l'override dei metodi virtuali definiti in una classe di base pubblica.

Quindi, ad esempio, se si dispone di un'implementazione interna di un'interfaccia pubblica, è ancora possibile esporre determinati membri come pubblici.

Inoltre, supponiamo di voler improvvisamente rendere pubblica la propria classe interna. È molto più semplice cambiare semplicemente il modificatore di accesso sulla classe rispetto a tutti i membri.