A MSDN tem na sua secção de artigos sobre C# em Visual Studio .Net uma Introdução a Estruturas de Dados em C# em 6 partes:
Os artigos estão bastante bem escritos, complementando a discussão das estruturas abstractas de dados com uma análise das suas implementações concretas no framework do .Net.Comecei recentemente a ler um livro que já comprei há dois anos:
"Programming C#", 1ª edição, por Jesse Liberty (editora O'Reilly)
Embora o livro já vá na terceira edição, não me apeteceu estar a deitar €50 para o lixo e comprar já o último, que custa €67...
O livro lê-se muito bem - as primeiras 200 páginas passaram num instante, com a sensação de estar a perceber tudo. Pode ser que as partes mais difíceis ainda estejam para vir...
Até agora estou a gostar muito. As parecenças com o Java são extraordinárias, e a funcionalidade básica é quase idêntica, mas existe alguma funcionalidade nova muito interessante. Até aqui acho que quase todas as diferenças são para melhor, tirando algumas pequenas coisas:
1. Não gosto da sintaxe para a implementação de Interfaces. Implementar um interface não é semanticamente a mesma coisa que herdar de uma classe. No entanto, a notação é idêntica para ambos os casos:
C#:
class MinhaClasse: MinhaClasseBase, MeuInterface1, MeuInterface2 (argumentos) {}
Java:
class MinhaClasse extends MinhaClasseBase implements MeuInterface1, MeuInterface2 (argumentos) {}
Em Java utiliza-se "extends" para herdar de uma classe base, e "implements" para implementar um ou mais interfaces. Além disso, em Java os objectos podem ser directamente instanciados com o tipo do interface:
C#:
MinhaClasse mc = new MinhaClasse();
MeuInterface1 mi1 = (MeuInterface1)mc;
Java:
MeuInterface1 mi1 = new MinhaClasse();
2. Não gosto da opção de tornar todos os métodos não-virtuais, obrigando o programador a adivinhar quais são os métodos que poderão vir a ser modificados por subclasses, e marcá-los com "virtual". Envolve futurologia, e não leva em conta que as necessidades dos utilizadores da classe podem ser bastante diferentes daquilo que o criador da classe imaginou. Pode-se ganhar em velocidade, mas perde-se em flexibilidade, e nestes tempos de CPUs baratos não me parece que a troca se justifique. Em Java todos os métodos são virtuais, a não ser que sejam marcados com "final".
3. Embora consiga perceber que podem ser muito convenientes, não sei se a complexidade adicional introduzida pelo "ref" e "out" se justifica. O Java e dezenas de outras linguagens mostram de forma conclusiva que não são de forma alguma necessários, e sabe-se que podem introduzir bugs difíceis de detectar, visto que aumentam o número de vias de comunicação entre métodos e os blocos de código que os invocam. Nalgumas linguagens funcionais modernas, como ML, Caml e Haskell, é até impossível modificar qualquer dos argumentos fornecidos a uma função, em concordância com a filosofia de "Functions should have no side-effects", que elimina duma só penada toda uma categoria de bugs. A informação entra na função unicamente através dos parâmetros que lhe são passados, e a informação sai da função unicamente através do valor devolvido pelo "return" ou equivalente.
4. Não consegui perceber ainda muito bem a diferença entre as keywords "new" e "overrides", mas parece-me que ambas seriam desnecessárias caso todos os métodos fossem virtuais por defeito.
Gosto muito das seguintes funcionalidades que não existem ainda em Java:
1. Properties
2. Enums
3. Arrays rectangulares
4. Foreach
5. Structs
6. Sobrecarga de operadores (para usar com contenção, mas muito útil)
7. Existência de um tipo decimal nativo
8. Boxing automático
9. Indexadores
10. Atributos são privados por defeito
11. Unificação de tipos primitivos com
Destas, o Java 1.5, que já está a circular em beta, implementa: 2. Enums; 4. Foreach; e 8. Boxing E UNBOXING automático, bem como algumas outras coisas:
Entrevista com Joshua Bloch sobre Java 1.5
Outras coisas que me parecem interessantes, mas que ainda não estudei:
- Delegates
- XML docstrings
- Events
- Attributes
Coisas que ainda não existem em C#:
- Anonymous Inner Classes
- Real Inner Classes (not Nested Classes)
- Generics (Java 1.5)
No entanto, não posso dizer que sinta muito a falta das 2 primeiras, que sempre achei pouco elegantes (especialmente as "Inner Classes"), embora sejam muito poderosas. Por aquilo que li, pareceu-me também que o C# não tem Asserções (Java: "assert").
Esta página tem links para uma série de comparações interessantes de C# com Java:
http://www.cs.wisc.edu/~plakal/538/cs/Csharp.html
As mais interessantes são:
A comparison of Microsoft's C# Programming Language to Sun Microsystems' Java Programming Language - Artigo longo de 2001 por Dare Obasanjo, um empregado da Microsoft que costuma escrever sobre XML.
A Comparative Overview of C# - Artigo de 2000 por Ben Albahari, da Genamics.
Conclusão:
No papel, o C# é decididamente uma linguagem mais expressiva e poderosa que a linguagem de programação Java (JPL - Java Programming Language), mas é também uma linguagem mais vasta e mais complexa. Se a imitação é a forma mais sincera de elogio, espero que os arquitectos do Java retribuam o grande elogio que o C# lhes prestou. Resta ainda ver se a utilização real da linguagem corresponde às altas expectativas que este livro despertou em mim.
É claro que o C# não se destina a ser utilizado no vácuo, mas sim em conjunção com a plataforma .Net, que tem essencialmente dois componentes:
- a máquina virtual .Net, designada por CLR (Common Language Runtime), correspondente à JVM (Java Virtual Machine)
- a biblioteca de classes FCL (Framework Class Library), correspondente à JCL (Java Class Library)
Como hoje em dia os programadores não usam linguagens, mas sim plataformas, seria mais justo comparar não as linguagens de programação C# e Java mas sim as plataformas Java (JPL/JCL/JVM) e C#.Net (C#/FCL/CLR). O facto de a máquina virtual Java estar gratuitamente disponível para Windows, Linux, MacOSX e Solaris, entre outros, significa que a plataforma Java tem pelo menos uma vantagem considerável em relação à plataforma .Net.
Recent Comments