public видно звідки завгодно.
internal видно лише в межах збірки
Ви, як правило, використовуєте внутрішній лише для захисту внутрішніх API. Наприклад, ви можете виявити кілька перевантажень методу:
public int Add(int x, int y)
public int Add(int x,int y, int z)
Обидва вони викликають внутрішній метод
internal int Add(int[] numbers)
Потім ви можете додати багато вишуканості методу, але "захистити" його, використовуючи фасадні методи, які можуть допомогти програмісту правильно викликати метод. (Наприклад, метод реалізації з параметром масиву може мати довільне обмеження значень.)
Також варто зазначити, що за допомогою Reflection будь-які методи можна викликати незалежно від їх видимості. Ще один "хак" для управління / отримання доступу до внутрішньо прихованих API.