A maioria dos idiomas (todos?) Com namespaces tendem a ser orientados a objetos. Muitas vezes, um nome legível por humanos para um tipo é apropriado, mesmo que haja várias implementações incompatíveis. (isso traz outras questões sobre a reutilização orientada a objetos, mas não é sobre isso que se trata). Por exemplo, em Java, você possui um Timer usado para tarefas da interface do usuário em segundo plano e um Timer usado para tarefas do aplicativo em segundo plano (não vinculadas ao AWT / Swing). O espaço para nome permite que você tenha esses objetos com o mesmo nome vivendo em diferentes sub-APIs.
A razão pela qual os namespaces surgiram tinha a ver com a tarefa irracional de antecipar como outros desenvolvedores nomeariam seus objetos. O C ++ introduziu o conceito (ou pelo menos foi o primeiro idioma ao qual fui exposto) e foi útil, mesmo que não houvesse diretrizes sobre as melhores práticas de uso. Java adaptou o conceito e adicionou algumas "práticas recomendadas" que incluíam o nome da sua empresa no espaço para nome. Dessa forma, você só precisava se preocupar com sua própria empresa.
A prefixação pode se tornar bastante confusa. Quando você aplica? Quando você não o aplica? Estruturas / classes / métodos globais obtêm o prefixo? E os métodos? E as propriedades na estrutura. Eu já vi todas essas coisas no código, embora felizmente nem todas de uma vez. Os espaços para nome fornecem alguma previsibilidade para todas essas perguntas e o tornam um recurso de linguagem e não uma "melhor prática" pessoal.
using
um espaço para nome específico e não precisa colocar o prefixo no início dos identificadores nesse espaço para nome.