ACTUALIZACIÓN: Esta pregunta fue el tema de mi blog en septiembre de 2014 . Gracias por la gran pregunta!
Existe un debate considerable sobre esta cuestión, incluso dentro del propio equipo compilador.
En primer lugar, es sabio entender las reglas. Un miembro público de una clase o estructura es un miembro accesible para cualquier cosa que pueda acceder al tipo que lo contiene . Entonces, un miembro público de una clase interna es efectivamente interno.
Entonces, dada una clase interna, ¿deberían sus miembros a los que desea acceder en la asamblea ser marcados como públicos o internos?
Mi opinión es: marcar tales miembros como público.
Utilizo "public" para significar "este miembro no es un detalle de implementación". Un miembro protegido es un detalle de implementación; hay algo al respecto que será necesario para que una clase derivada funcione. Un miembro interno es un detalle de implementación; Algo más interno de esta asamblea necesita el miembro para funcionar correctamente. Un miembro público dice "este miembro representa la funcionalidad clave y documentada proporcionada por este objeto".
Básicamente, mi actitud es: supongamos que decidí convertir esta clase interna en una clase pública. Para hacer eso, quiero cambiar exactamente una cosa : la accesibilidad de la clase. Si convertir una clase interna en una clase pública significa que también tengo que convertir a un miembro interno en un miembro público, entonces ese miembro era parte de la superficie pública de la clase, y debería haber sido público en primer lugar.
Otras personas no están de acuerdo. Hay un contingente que dice que quieren poder echar un vistazo a la declaración de un miembro y saber de inmediato si solo se llamará desde el código interno.
Desafortunadamente, eso no siempre funciona bien; por ejemplo, una clase interna que implementa una interfaz interna todavía tiene que tener los miembros implementadores marcados como públicos, porque son parte de la superficie pública de la clase .