diferenças
Figura 3 - Estruturas para organizações das classes
Quando desenvolvemos uma aplicação, é interessante, para não dizer necessário, que as classes sejam distribuídas, ou organizadas, de forma que a estrutura organizacional passe, semanticamente uma regra, a qual esboce responsabilidades de cada conjunto de classes. Em Java, esta organização é realizada através de pacotes (packages) e, em C#, esta organização é conhecida por namespaces.
Conceitualmente não existem diferenças entre as duas linguagens, porém, sintaticamente existem diferenças, mas nada que não seja de fácil assimilação. Veja:
Em Java, um pacote representa fisicamente uma pasta (ou diretório para os puristas);
Em C# um namespace não está relacionado a uma pasta. É possível ter uma pasta com um nome e dentro desta pasta, classes que pertençam a um namespace com outro nome, ou ainda, em uma pasta é possível existirem classes com namespaces diferentes;
Prós e Contras
Para quem está iniciando em uma das linguagens, sem conhecer a outra, o aprendizado é fácil e natural, mas, para quem vem da linguagem Java para C#, confusões conceituais podem ocorrer, principalmente em relação ao fato de uma classe não necessariamente estar relacionada de forma direta a uma pasta, como ocorre em Java. Note que, caso você esteja fazendo uso de IDEs, a composição do nome de um namespace pode ser afetada caso a classe esteja sendo criada dentro de uma pasta, ou seja, o IDE pode compor o nome do namespace da classe a ser criada com o nome da pasta onde a criação esteja ocorrendo. Mas lembre-se que, ao contrário de Java, isso não é obrigatório em C#.
Assim como em Java que tem sua classe devidamente nomeada com o uso dos nomes dos pacotes a que ela pertence, uma classe em C# tem seu nome devidamente qualificado quando é referenciada com o caminho completo, que inclui o namespace da mesma. Em Java temos, por exemplo, javax.swing.JButton e em C# temos System.Windows.Forms.Button.
Particularmente