segunda-feira, 28 de outubro de 2019

.NET para Java Developers


O .NET é uma plataforma como a plataforma Java que roda sobre diferentes Sistemas Operacionais, ou seja, é um ambiente de desenvolvimento e execução de programas multilinguagem e multiplataforma que visa facilitar o desenvolvimento e execução de programas, disponibilizando bibliotecas, compilador, máquina virtual, controle de memória, e outras coisas mais.

Por ser da Microsoft ela começou focada apenas no ambiente Windows com o .NET Framework, mas desenvolveu o .NET Core que é multiplataforma como o Java, desde que o S.O. destino tenha implementado as especificações para rodar o .NET Core.

1 - Plataforma .Net Framework (Ambiente de execução para Windows)

O .NET Framework é usado para construir aplicações desktop e/ou aplicações ASP.NET rodando no IIS (Internet Information Server). O ambiente resume-se nesses 4 pontos:

- CLR - Common Language Runtime (Maquina virtual como a JVM no Java)
- Biblioteca .Net Framework - Biblioteca de classes
- Aplicação .NETProgramas que fazemos (Escritos a partir das linguagens do próximo ponto e compiladas para MSIL - Microsoft Intermediate Language)
- Linguagens suportadas: VB, ASP, ASP.net, C#, etc.

2 - Plataforma .NET Core

O .NET Core é uma implementação grátis, de código aberto, cross-platform do .NET Framework. Ele suporta quatro tipos de aplicações: console, ASP.NET Core, cloud, e Universal Windows Platform (UWP). O ambiente resume-se nesses 4 pontos:

- CLR - Common Language Runtime (Maquina virtual como a JVM no Java)
- Bilbioteca .Net Core - Biblioteca de classes
- Aplicação .NET - Programas que fazemos  (Escritos a partir das linguagens do próximo ponto e compiladas para MSIL - Microsoft Intermediate Language)
- Linguagens suportadas: C#, Visual Basic, F#, etc...

3 - .NET Standard

O .NET Standard é uma especificação para implementar a BCL(Base Class Libraries - uma coleção de Bibliotecas de Classe).

Uma vez que uma implementação .NET (Framework ou Core) precisa seguir esse padrão, desenvolvedores de aplicações não terão que se preocupar com diferentes versões do BCL pra cada implementação de framework de código gerenciado.

Resumindo, o .NET Standard funciona como as especificações Java.

OBS: O .NET Framework implementa o .NET Standard mas tem coisas a mais específicas para o Windows, já que o Standard visa justamente a questão da multiplataforma.

4 - Tipo de dados principais:

byte [0-255]
short, int, long
float, double, decimal
bool
string (com 'S' minúsculo)
String (deve importar o namespace System)
object (com O minúsculo)
enum

5 - Cast com C#

Cliente outroCliente = (Cliente) obj; //tradicional como no Java
Cliente outroCliente = obj as Cliente; //Testa se é do mesmo tipo, se não setta nulo, evitando a exceção de tipo imcompatível

6 - Concatenando Strings no C# com propriedades

string a = "Número " + Numero + ", Agência " + Agencia + ", Saldo " + Saldo;
string b = $"Número {Numero}, Agência {Agencia}, Saldo {Saldo}";
string c = @"Texto de várias linhas sem precisar ficar concatenando com ‘+’ ";

7 - Modificadores de Acesso

public = Pode se acessado por todo mundo
private = Apenas acesso interno
protected = Apenas acesso interno e por classes filhas
internal = Deixa a visibilidade apenas para o projeto ao qual pertence (padrão para classes no C#)
internal protected = Modificador formado por duas palavras e que une a funcionalidade do protected e internal

8 - Campos de uma classe

Campos de classes no C# são equivalentes as propriedades de uma classe no Java, a partir deles podemos construir as Propriedades no C#, conceito explicado pouco mais a frente.

Uma coisa interessante sobre os campos é que podemos usar a palavra reservada "readOnly" para definir um campo que pode ter seu valor setado apenas no construtor, e que não pode mais ser alterado depois, mesmo dentro da própria classe!

9 - Properties (Propriedades) no C#

Em Java, propriedades são os campos de uma classe, podendo ser de tipo primitivo ou objetos, geralmente privados com acesso via getters e setters.

Em C#, Propriedades são um conceito um pouco diferente, como se juntassem em uma única coisa as propriedades do Java (campos da classe) e seus métodos getter's e setter's. As Properties (Propriedades) começam com letra maiúscula. Sua declaração na versão simplificada é:

public double Altura {get; set;}

Isso serve para tipos primitivos, objetos, listas etc...

public Pessoa Funcionario {get; set;}

public List<Card> MeuCard {get; set;}

public int Abc {get; private set;}

No C#, o método set por padrão recebe uma variável de nome "value", portanto, para os casos em que se deseja fazer uma validação ou outra coisa no método set, usa-se o value.

OBS: Quando não escrevemos o método setter de uma Propriedade, o compilador cria um campo privado e "readOnly" e apenas o getter do campo.

10 - Herança no C#

Para dizer que uma classe implementa uma interface ou estende uma classe em C# basta colocar ":" entre o nome da classe atual e a classe que ela estende e/ou lista de interfaces separadas por virgula.

Não há diferença a declaração de implementar e estender em C#. Porém, a classe estendida deve vir primeiro que as interfaces.

Exemplo, temos o seguinte:
Classe B, Interface C, D e E. A classe A estende B e implementa C,D e E:

public class A : B, C, D, E {
    ...
}

A classe filha pode fazer referência aos membros da classe pai com uso palavra reservada "base", que seria o mesmo que "super" em Java.

11 - Sobrescrita de métodos (Polimorfismo):

Na classe pai é preciso usar a palavra "virtual" depois do modificador de acesso:

public virtual double GetBonificacao()
{
   return Salario * 0.10;
}

Na classe filha é preciso usar a palavra "override" depois do modificador de acesso:

public override double GetBonificacao()
{
   return Salario + base.GetBonificacao();;
}

OBS: As propriedades no C# (Lembrando que o conceito de propriedades no C# é diferente do Java) também podem fazer uso de "virtual" e "override" para sobrescrita, já que elas contém os métodos getter's e setter's e é possível que seja necessário a sobrescrita de um desses ou até dos dois.

12 - Construtores

Construtores da classe filha chamando construtores da classe pai é bem diferente no C#.

Pai:
public Funcionario(string cpf)
{
    CPF = cpf;
}

Filha:
public Diretor(string cpf) : base(cpf)
{
}

Também é diferente a chamada de construtores da mesma classe. Um construtor pode chamar outro construtor da própria classe com o uso da palavra reservada "this":

public Funcionario(string cpf) : this(1500, cpf) // chama o construtor abaixo!
{
}

public Funcionario(double salario, string cpf)
{
    Salario = salario;
    CPF = cpf;
}

13 - Foreach

No C# o foreach é diferente do Java:

ContaCorrente[] itens = new ContaCorrente[10];
foreach(ContaCorrente conta in items)
{
...
}

14 - Trabalhando com Datas

DateTime dataFimPagamento = new DateTime(2019, 10, 21);
DateTime dataAtual = DateTime.Now;

TimeSpan diferencaEntreDatas = dataFimPagamento - dataAtual;

Console.WriteLine("Diferença em dias: " + diferencaEntreDatas.Days);

OBS: Existe uma biblioteca chamada "Humanizer" que vem com vários métodos para trabalhar com TimeSpan e exibir intervalos de datas de forma amigável para o usuário final.

15 - Comentários

Comentários de documentação (equivalente ao javadoc)

Além de escrever os comentários, precisa-se configurar o build para gerar o xml dos comentários quando compilar o código. Vamos ver o comentário de documentação:


/// <summary>
/// Verifica a senha fornecida.
/// </summary>
/// <param name="senhaUsuario">Recebe a senha salva no parâmetro <paramref name="senhaUsuario"/>.</param>
/// <param name="senhaTentativa">Recebe a senha fornecida no parâmetro <paramref name="senhaTentativa"/>.</param>
/// <returns>bool</returns>
public bool CompararSenha(string senhaUsuario, string senhaTentativa)
{
   return senhaUsuario == senhaTentativa;
}

Demais comentários são como o Java.

       Essas são as diferenças básicas entre o C# e o Java, porém a medida que se aprofunda no uso do C# com certeza existirão outras diferenças entre as linguagens. O objetivo aqui é fazer um resumo para quem precisa começar com o C#.

Nenhum comentário:

Postar um comentário