Pubblico e membri Interni in una classe Interna?

Ok, quindi questo può essere un po ‘ una domanda stupida, e c’è sicuramente la risposta più ovvia, ma ero curioso di sapere se ho perso le sottigliezze qui.

C’è qualche differenza in termini di visibilità/usabilità tra un public stati dichiarati in un internal di classe e di un internal stati dichiarati in un internal classe?

cioè tra

internal class Foo
{
    public void Bar()
    {
    }
}

e

internal class Foo
{
    internal void Bar()
    {
    }
}

Se si dichiara il metodo public e anche virtual, e quindi escludeva in una classe derivata che è public, la ragione per l’utilizzo di questo modificatore è chiaro. Tuttavia, è questa l’unica situazione… mi manca qualcos’altro?

  • Se si dichiara il metodo di come pubblico e anche virtuale, e quindi escludeva in una classe derivata che è pubblico meeeep!: non È consentito per aumentare la visibilità, solo al contrario: È possibile creare una classe derivata di una classe pubblica, che è interno (o anche nidificati e privata)
  • Googler, prendete nota: Questo vicino duplicato question contiene un altro particolare ed eccellente risposta.
InformationsquelleAutor Noldorin | 2010-04-01



5 Replies
  1. 55

    Considerare questo caso:

    public interface IBar { void Bar(); }
    internal class C : IBar
    {
        public void Bar() { }
    }

    Qui C. Bar non può essere contrassegnato come interno; in questo modo è un errore, perché C. Bar si può accedere da un chiamante del D. GetBar():

    public class D
    {
        public static IBar GetBar() { return new C(); } 
    }
    • Grazie Eric, questo è un altro buon esempio. In modo efficace implementazione dell’interfaccia e l’ereditarietà di classe sono i motivi per consentire che il public o internal modificatore in un internal classe. In altri casi, essi sono equivalenti sembrerebbe.
    • Eric, inoltre, risponde a una quasi identica domanda: stackoverflow.com/a/9302642/398015 Ci sono ulteriori dettagli in un suo post che aggiungere una considerevole quantità di sostanza per la risposta di cui sopra.
  2. 39

    Un public membro è ancora solo internal quando in un internal classe.

    Da MSDN:

    L’accessibilità di un membro non può mai essere maggiore l’accessibilità del tipo che lo contiene. Per esempio, un metodo pubblico ha dichiarato in un’interna tipo ha solo accessibilità interna

    Penso in questo modo, vorrei accedere a un public proprietà su….? Una classe non riesco a vedere? 🙂

    Di Eric risposta è molto importante, in questo caso, se è esposto tramite un’interfaccia e non è direttamente non fare la differenza, dipende solo se sei in quella situazione con il membro che si sta trattando.

    • Sì, era proprio questo è esattamente il mio pensiero, tranne per il caso di Eric sottolineato (come quello nella mia domanda iniziale).
    • E ‘ anche una differenza quando si utilizza la riflessione. Di Default senza parametri, metodi come Tipo.GetMethods() solo ritorno membri pubblici. E il metodo pubblico all’interno di una classe non sa ancora che è pubblico.
    • “L’accessibilità di un membro non può mai essere maggiore l’accessibilità del tipo che lo contiene.” Mentre questo è vero per alcuni casi, un public membro di un private classe è chiaramente un campo di applicazione più ampio rispetto a un private membro di un private classe (ex progetto ampio, questi ultimi solo per la classe).
    • sì…ma non per l’ex dichiarazione false, si stanno confrontando coetanei non contenitori che – in cui le cose sono accessibili non cambia, dal momento che non è possibile accedere a un membro pubblico dall’esterno privato classe contenitore.
  3. 2

    Solo di fronte a un altro esempio dove c’ è differenza tra i due, quando utilizzato da XAML in WPF.

    XAML:

    <Button Tag="{x:Static vm:Foo+Bar.e1}" />

    Codice con internal enum compila correttamente:

    internal class Foo
    {
        internal enum Bar
        {
            e1,
            e2,
        }
    }

    Ma, a sorpresa, cambiando di public risultati in errore:

    internal class Foo
    {
        public enum Bar
        {
            e1,
            e2,
        }
    }

    L’ultimo esempio produce un errore di compilazione:

    errore MC3064: Solo pubbliche o interne classi possono essere utilizzate all’interno di markup. ‘Bar’ non è di tipo pubblico o interno.

    Purtroppo, non riesco a spiegare cosa c’è di sbagliato con public in questo caso. La mia ipotesi è “solo perché WPF funziona in questo modo”. Basta cambiare il modificatore di classe nidificata per internal per sbarazzarsi di errore.

    • Grazie anche per questo! Non avrei mai indovinare cosa c’era di sbagliato con il mio XAML
  4. 1

    public membri di un internal classe può ignorare public membri di public classi di base e, quindi, essere un po ‘ più esposto… se indirettamente.

  5. 1

    Se si tratta di una riflessione importa se il membro è pubblica o non:

    Per esempio si potrebbe anche passare un nidificati classe privata di una associazione di WPF e l’associazione avrebbe funzionato contro la pubblica proprietà, proprio come al solito.

Lascia un commento