AGGIORNAMENTO: Questa domanda è stata l'oggetto del mio blog a settembre 2014 . Grazie per l'ottima domanda!
C'è un considerevole dibattito su questa domanda anche all'interno dello stesso team di compilatori.
Prima di tutto, è saggio capire le regole. Un membro pubblico di una classe o di una struttura è un membro accessibile a tutto ciò che può accedere al tipo contenente . Quindi un membro pubblico di una classe interna è effettivamente interno.
Quindi ora, data una classe interna, i suoi membri a cui desideri accedere nell'assemblea dovrebbero essere contrassegnati come pubblici o interni?
La mia opinione è: contrassegnare tali membri come pubblici.
Uso "pubblico" per indicare "questo membro non è un dettaglio di implementazione". Un membro protetto è un dettaglio di implementazione; c'è qualcosa che sarà necessario per far funzionare una classe derivata. Un membro interno è un dettaglio di implementazione; qualcos'altro interno a questo assembly ha bisogno del membro per funzionare correttamente. Un membro pubblico dice "questo membro rappresenta la chiave, funzionalità documentata fornita da questo oggetto".
Fondamentalmente, il mio atteggiamento è: supponiamo di aver deciso di trasformare questa classe interna in una classe pubblica. Per fare ciò, voglio cambiare esattamente una cosa : l'accessibilità della classe. Se trasformare una classe interna in una classe pubblica significa che devo anche trasformare un membro interno in un membro pubblico, quel membro faceva parte della superficie pubblica della classe e avrebbe dovuto essere pubblico in primo luogo.
Altre persone non sono d'accordo. C'è un contingente che dice che vogliono essere in grado di dare un'occhiata alla dichiarazione di un membro e sapere immediatamente se verrà chiamato solo dal codice interno.
Sfortunatamente, ciò non sempre funziona bene; ad esempio, una classe interna che implementa un'interfaccia interna deve ancora avere i membri di implementazione contrassegnati come pubblici, perché fanno parte della superficie pubblica della classe .