public est visible de partout.
internal n'est visible que dans un assemblage
Vous avez tendance à utiliser uniquement interne pour protéger les API internes. Par exemple, vous pouvez exposer plusieurs surcharges d'une méthode:
public int Add(int x, int y)
public int Add(int x,int y, int z)
Les deux appellent la méthode interne
internal int Add(int[] numbers)
Vous pouvez alors mettre beaucoup de sophistication sur une méthode, mais la «protéger» en utilisant des méthodes de façade qui peuvent aider le programmeur à appeler la méthode correctement. (La méthode d'implémentation avec le paramètre array peut avoir une limite arbitraire de valeurs, par exemple.)
Il convient également de noter qu'en utilisant Reflection, toutes les méthodes sont appelables quelle que soit leur visibilité. Un autre «hack» pour contrôler / accéder aux API cachées en interne.