Roteiro para desenvolvedores Java aprendendo C#
O C# e o Java têm muitas semelhanças. Ao aprender C#, você pode aplicar grande parte do seu conhecimento prévio de programação em Java:
- Sintaxe semelhante: Java e C# estão na família C de idiomas. Essa similaridade significa que você já pode ler e entender C#. Há algumas diferenças, mas a maior parte da sintaxe é igual a Java e C. As chaves e os ponto-e-vírgula são familiares. As instruções de controle, como
if
,else
eswitch
, são as mesmas. As instruções de loopfor
,while
edo
...while
são as mesmas. As mesmas palavras-chave paraclass
einterface
estão nos dois idiomas. Os modificadores de acesso depublic
atéprivate
são os mesmos. Mesmo muitos dos tipos internos usam as mesmas palavras-chave:int
,string
edouble
. - Paradigma orientado a objeto: Java e C# são linguagens orientadas a objetos. Os conceitos de polimorfismo, abstração e encapsulamento se aplicam em ambas as linguagens. Ambos adicionaram novos constructos, mas os principais recursos ainda são relevantes.
- Fortemente tipado: Java e C# são linguagens fortemente tipadas. Você declara o tipo de dados de variáveis, explicitamente ou implicitamente. O compilador impõe a segurança do tipo. O compilador captura erros relacionados ao tipo em seu código antes de executar o código.
- Multiplataforma: Java e C# são multiplataforma. Você pode executar suas ferramentas de desenvolvimento em sua plataforma favorita. Seu aplicativo pode ser executado em várias plataformas. Sua plataforma de desenvolvimento não precisa necessariamente corresponder à plataforma de destino.
- Tratamento de exceção: Java e C# geram exceções para indicar erros. Ambos usam blocos
try
-catch
-finally
para lidar com exceções. As classes exception têm nomes e hierarquias de herança semelhantes. Uma diferença é que o C# não tem o conceito de exceções verificadas. Qualquer método pode (em teoria) gerar qualquer exceção. - Bibliotecas padrão: o runtime do .NET e a Biblioteca Padrão Java (JSL) têm suporte para tarefas comuns. Ambos têm ecossistemas extensos para outros pacotes de software livre. No C#, o gerenciador de pacotes é NuGet. É análogo ao Maven.
- Coleta de lixo: ambos os idiomas empregam o gerenciamento automático de memória por meio da coleta de lixo. O runtime recupera a memória de objetos que não são referenciados. Uma diferença é que o C# permite que você crie tipos de valor, como tipos
struct
.
Você será produtivo em C# quase imediatamente devido às semelhanças. À medida que você progride, você deve aprender recursos e idiomas em C# que não estão disponíveis em Java:
- Correspondência de padrões: a correspondência de padrões permite instruções condicionais concisas e expressões com base na forma de estruturas de dados complexas. A instrução
is
verifica se uma variável "é" algum padrão. A expressão baseada em padrãoswitch
fornece uma sintaxe avançada para inspecionar uma variável e tomar decisões com base em suas características. - Interpolação de cadeia de caracteres e literais de cadeia de caracteres brutos: a interpolação de cadeia de caracteres permite inserir expressões avaliadas em uma cadeia de caracteres, em vez de usar identificadores posicionais. Literais de cadeia de caracteres brutos fornecem uma maneira de minimizar sequências de escape no texto.
- Tipos anuláveis e não anuláveis: O C# dá suporte a tipos de valor anuláveis e tipos de referência anuláveis acrescentando o sufixo
?
a um tipo. Para tipos que permitem valor nulo, o compilador avisa se você não verificarnull
antes de desreferenciar a expressão. Para tipos não anuláveis, o compilador avisa se você pode estar atribuindo um valornull
a essa variável. Tipos de referência não anuláveis minimizam erros de programação que lançam um System.NullReferenceException. - Métodos de extensão: em C#, você pode criar métodos que estendem uma classe ou interface. Os métodos de extensão estendem o comportamento de um tipo de uma biblioteca ou todos os tipos que implementam uma determinada interface.
- LINQ: a consulta integrada à linguagem (LINQ) fornece uma sintaxe comum para consultar e transformar dados, independentemente de seu armazenamento.
- Funções locais: em C#, você pode aninhar funções dentro de métodos ou outras funções locais. As funções locais fornecem mais uma camada de encapsulamento.
Há outros recursos em C# que não existem em Java. Você verá recursos como async
e await
e instruções using
para liberar automaticamente recursos não obrigatórios.
Há também alguns recursos semelhantes entre C# e Java que têm diferenças sutis, mas importantes:
- Propriedades e indexadores: ambas as propriedades e indexadores (tratando uma classe como uma matriz ou dicionário) têm suporte de idioma. Em Java, eles estão nomeando convenções para métodos que começam com
get
eset
. - Registros: em C#, os registros podem ser tipos
class
(referência) oustruct
(valor). Os registros C# podem ser imutáveis, mas não precisam necessariamente ser imutáveis. - As tuplas têm sintaxe diferente em C# e Java.
- Os atributos são semelhantes às anotações Java.
Por fim, há recursos de linguagem Java que não estão disponíveis em C#:
- Exceções verificadas: em C#, qualquer método poderia teoricamente gerar qualquer exceção.
- Covariância de matriz marcada: em C#, as matrizes não são covariantes com segurança. Você deve usar as classes e interfaces de coleção genéricas se precisar de estruturas covariantes.
No geral, aprender C# para um desenvolvedor experiente em Java deve ser suave. Você encontrará expressões familiares suficientes para ser rapidamente produtivo, e aprenderá os novos idiomas rapidamente.