La mayoría de los idiomas (¿todos?) Con espacios de nombres tienden a estar orientados a objetos. Muchas veces es apropiado un nombre legible para un tipo, aunque existen múltiples implementaciones incompatibles. (Esto plantea otros problemas sobre la reutilización orientada a objetos, pero de eso no se trata esta pregunta). Por ejemplo, en Java tiene un temporizador que se utiliza para tareas de IU en segundo plano y un temporizador que se utiliza para tareas de aplicación en segundo plano (no vinculadas a AWT / Swing). El espacio de nombres le permite tener estos objetos con el mismo nombre viviendo en diferentes sub-API.
La razón por la que surgieron los espacios de nombres tuvo que ver con la irrazonable tarea de anticipar lo que otros desarrolladores nombrarán sus objetos. C ++ introdujo el concepto (o al menos fue el primer idioma al que estuve expuesto con el concepto), y fue útil a pesar de que no había pautas sobre las mejores prácticas de uso. Java adaptó el concepto y agregó algunas "mejores prácticas" que incluyeron el nombre de su empresa en el espacio de nombres. De esa manera, solo tenía que preocuparse por su propia empresa.
Los prefijos pueden volverse bastante desordenados. ¿Cuándo lo aplicas? ¿Cuándo no lo aplica? ¿Las estructuras / clases / métodos globales obtienen el prefijo? ¿Qué hay de los métodos? ¿Qué pasa con las propiedades en la estructura? He visto todas estas cosas en código, aunque afortunadamente no todas a la vez. Los espacios de nombres proporcionan cierta previsibilidad a todas estas preguntas y lo convierten en una característica del lenguaje en lugar de una "mejor práctica" personal.
using
un espacio de nombres en particular y luego no tiene que poner el prefijo al comienzo de los identificadores en ese espacio de nombres.