C#: Conhecendo a linguagem orientada a objetos mais popular da Microsoft

C#: Conhecendo a linguagem orientada a objetos mais popular da Microsoft

Em 2002, com o surgimento da plataforma .NET, o mundo conheceu o C# uma poderosa linguagem de programação orientada a objetos, que pode ser empregada no desenvolvimento de diversos tipos de projetos de software.

Hoje o C# é a linguagem mais popular presente na plataforma .NET e está em constante evolução. De acordo com os dados da Pesquisa “Tecnologias mais populares de 2022”, do StackOverflow, o C# ocupa a 8ª posição de linguagens mais usadas por pessoas desenvolvedoras — o que corresponde a 27,98% do total.

Gráfico de barras com o percentual de utilização de cada linguagem de programação, destacando o C# em 8º lugar com 27,85% na pesquisa realizada pela plataforma StackOverflow em 2022.

Créditos: “2022 Most popular technologies”, StackOverflow

Se você está na dúvida sobre qual linguagem escolher para começar seus estudos, neste artigo te apresentaremos uma visão geral sobre o C#. Quem sabe, ao final da leitura, já escreva seu primeiro — “Olá, mundo!” nesta linguagem. 😁

O que é C#?

A C# (lê-se “C sharp”) é a principal linguagem de programação em .NET. Inclusive, ela surgiu com a primeira versão da plataforma, em 2002.

Com C# é possível desenvolver aplicações de praticamente todos os tipos: desde aplicações embarcadas até aplicativos de área de trabalho, mobile e sistemas web.

Como é orientada a objetos, é possível criar classes e estruturas de programação que são reaproveitadas por diversas aplicações.

Além do mais, tem uma sintaxe simples, o que facilita a aprendizagem. Isso se consolidou porque, em seu processo de desenvolvimento, foram adotadas facilidades das linguagens C e C++, além de outros recursos mais avançados provenientes das linguagens (como Java).

As principais características do C# são:

  • Suporte à orientação a objetos: por implementar o paradigma da orientação a objetos, o C# permite a criação de classes, objetos e interfaces, além da aplicação de conceitos como herança, polimorfismo e encapsulamento.

  • Segurança de tipos: a linguagem C# é fortemente tipada. Então, antes de declarar uma variável, é necessário declarar o seu tipo. Depois disso, no decorrer da execução, a variável não pode assumir outro tipo.

  • Garbage collector: é a ferramenta que se encarrega de descartar da memória, de forma automática, objetos que a aplicação não utilizar mais, Assim, quem desenvolve usando C#, não precisa se preocupar com o gerenciamento de memória.

  • Tratamento de exceções: proporciona a possibilidade de capturar e tratar uma série de exceções que podem ocorrer durante a execução da aplicação.

  • Interoperabilidade: dá a possibilidade de interagir com soluções criadas em outras linguagens como C++, por exemplo. Isso é feito por meio do recurso da CLR que permite o consumo das bibliotecas existentes.

C# uma sintaxe simples

Já identificamos algumas características do C#, que tal darmos mais um passo neste artigo e entendermos como é sua sintaxe?

De forma parecida com outras linguagens de alto nível, num programa em C#, podemos dividir o código em diversos arquivos do tipo .cs — as conhecidas unidades de compilação.

Para criar esses arquivos, podemos usar um simples bloco de notas e o compilador csc.

No entanto, o mais indicado é escolher uma ferramenta como Visual Studio Community, VS Code ou Rider (uma outra opção proprietária).

Com o código em C# abaixo, vamos exibir uma mensagem em um terminal:

namespace Artigo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World! Conhecendo o .NET");
        }
    }
}

Esse código define um método main, que é o ponto de partida para começar a execução de uma aplicação .NET.

Você pode usar o editor de texto de sua escolha, digitar essas instruções e complicar usando o csc. Nesse ponto, para ser mais produtivo, você pode usar algumas das ferramentas que já citei, que trazem vantagens como autocompletar a digitação.

É importante ressaltar também que, a partir do .NET e da versão C# 9, a plataforma facilitou o trabalho das pessoas desenvolvedoras e se aproximou de outras linguagens minimalistas.

Afinal de contas, trouxe as instruções de nível superior como novidade.

Olha só como ficaria o mesmo código do mainescrito de maneira minimalista em um projeto com as instruções de nível superior:

 Console.WriteLine("Hello, World! Conhecendo o .NET");

Esse recurso só é válido para projetos do tipo console, executados dentro de um prompt e que são habilitados, exclusivamente, através de um único arquivo por projeto.

Assim, não é preciso explicitar o método main para o aplicativo em desenvolvimento. Ele será criado conforme o código for compilado.

O objetivo dessa prática é facilitar a escrita de programas acessíveis para pequenos utilitários como o Azure Functions ou GitHub Actions, que pode ajudar quem está começando na linguagem.

Um ponto de atenção é que C# é uma linguagem case sensitive**. Ou seja, faz distinção entre palavras que começam com letra maiúscula e minúscula. Então, por exemplo, andre é diferente de Andre.

Além do mais, como você já sabe, ela é uma linguagem fortemente tipada. Isso significa que, quando for definir uma variável ou objeto, a pessoa desenvolvedora precisa informar o seu tipo, como nesse exemplo:

string nome = “André Silva”;
Console.WriteLine(nome); //exibe a mensagem no terminal

A Microsoft também criou uma conveniência sintática muito conveniente: as variáveis locais de tipo implícito, que usam a palavra reservada var.

A função dessa palavra é instruir o compilador a inferir o tipo de uma variável. Para isso, deve-se usar uma expressão no lado direito da instrução de inicialização do objeto ou variável. Dessa forma:

var nome= “André Silva”;

var pessoa = new Pessoa();

No entanto, é importante ter atenção em alguns pontos dessa abordagem. Em primeiro lugar, deve-se usar no momento da inicialização de uma variável ou objeto.

Depois, só são válidas em variáveis locais. Ou seja, elas devem estar no escopo de um método.

Por fim, podem estar presentes na definição da inicialização de laços for ou foreach e na instrução using.

No C# há também os tipos anônimos que, de acordo com a própria Microsoft, são uma forma conveniente de encapsular propriedades do tipo “somente leitura” em um único objeto sem precisar definir um tipo de forma explícita.

Confira no exemplo abaixo:

var pessoa = new { Nome = "André", Idade = 40 };
Console.WriteLine($"Nome = {pessoa.Nome} e Idade = {pessoa.Idade}");

Dessa forma, os tipos anônimos formam classes compostas de propriedades públicas “somente leitura”.

Além disso, o nome e o tipo dessas classes são gerados pelo compilador do C# e não são acessíveis por meio do código. Ou seja, é o compilador que infere os tipos das propriedades.

Como em outras linguagens, no C# também tem a definição de tipos de dados primitivos — como mostra a tabela abaixo — e a pessoa desenvolvedora define os tipos complexos (classes).

Tipo de DadoDescriçãoTamanho
boolvalor booleano (verdadeiro ou falso).1 byte (True/False)
byteinteiro sem sinal de 8 bits.1 byte (0 a 255)
sbyteinteiro com sinal de 8 bits.1 byte (-128 a 127)
charcaractere Unicode.2 bytes
shortinteiro com sinal de 16 bits.2 bytes
ushortinteiro sem sinal de 16 bits.2 bytes
intinteiro com sinal de 32 bits.4 bytes
uintinteiro sem sinal de 32 bits.4 bytes
longinteiro com sinal de 64 bits.8 bytes
ulonginteiro sem sinal de 64 bits.8 bytes
floatnúmero de ponto flutuante de precisão simples.4 bytes
doublenúmero de ponto flutuante de precisão dupla.8 bytes
decimalnúmero decimal de alta precisão.16 bytes

As classes em C# são os tipos complexos, que é um dos conceitos centrais do paradigma da orientação a objetos.

No geral, uma classe representa um elemento presente na nossa rotina, como, por exemplo, uma pessoa, um carro ou um livro.

Para mergulhar mais profundamente na sintaxe do C# e entender melhor os fundamentos da linguagem, você pode acessar a documentação oficial do C#.

Ou, se preferir, visitar o Tech Guide C#. Também disponibilizamos o acesso da nossa apostila sobre o tema C# e um vídeo de como desenvolver boas práticas de programação.

Banner de divulgação da Imersão IA da Alura em colaboração com o Google. Mergulhe em Inteligência artificial com a Alura e o Google. Serão cinco aulas gratuitas para você aprender a usar IA na prática e desenvolver habilidades essenciais para o mercado de trabalho. Inscreva-se gratuitamente agora!

C# e orientação a objetos

Desde o início, o C# já foi desenvolvido com suporte ao paradigma de programação da orientação a objetos — a famosa OO.

Esse paradigma (modelo de programação) permite criar softwares de maneira a aproximar conceitos do mundo real com o código.

Opa, mas como assim? Bom, vamos lá, um exemplo vai ajudar a clarear esse conceito.

É possível, por exemplo, traduzir para o código algumas ideias como “pessoa” ou “equipamento” usando esse paradigma.

Essas palavras vão representar objetos de software que se comunicarão e implementarão uma funcionalidade do sistema.

Esse estilo de programação não surgiu com o C# ou com o Java — que é uma das linguagens responsáveis pela popularização do paradigma.

Na verdade, a orientação a objetos nasceu lá nos anos de 1960, na Noruega, com o objetivo de criar sistemas mais confiáveis, flexíveis e de fácil manutenção.

Desde então, a orientação a objetos se consolidou no mercado de desenvolvimento.

Algumas das principais vantagens de desenvolver sob o guarda-chuva da OO são:

  • Curva de aprendizagem: a OO é uma forma de programar. Sendo assim, uma vez que uma pessoa conhece bem seus fundamentos, a linguagem é somente mais uma ferramenta.
  • Reutilização: esta é uma das principais forças na adoção da OO, já que é possível reaproveitar classes e tipos entre projetos diferentes. Assim, reduz o tempo de implementação e diminui os custos com a manutenção da aplicação.

No decorrer deste artigo, você vai se deparar com outros conceitos da OO que ajudam a entender o quão vantajoso é utilizá-la.

Classes e objetos

No subtítulo desta seção do nosso texto já damos spoiler (😅) de dois dos conceitos essenciais na orientação a objeto: as classes e os objetos.

Classes

Uma forma fácil de entender esse conceito é a partir da analogia com carros. Vamos lá.

É possível classificar os carros, com base em algumas características comuns como, por exemplo, quantidade de portas, placa, modelo e daí por diante.

Assim como nos carros, na orientação a objetos, uma classe ajuda a identificar e *classificar vários objetos que compartilham características comuns.

Você pode se aprofundar nas características das classes lendo nosso artigo sobre esse tema.

Em uma definição mais formal, classe é um modelo, um tipo de planta que serve para criar objetos.

Em C#, uma classe pode ser apresentada da seguinte forma:

class Conta{
     int numero;
     string titular;
     double saldo;
}

A partir disso, são definidos atributos e características observáveis dos objetos que são importantes para executar o sistema.

Um exemplo disso é a classe “conta”, na qual, após um processo de análise, abstraiu o número, o titular e o saldo como atributos importantes.

Mas a classe não define apenas atributos. Ela também pode estabelecer os comportamentos que um objeto tem.

Sendo assim, em resumo, a classe define os atributos e os métodos que os objetos de uma classe terão, como nesse exemplo:

class Conta{
     int numero;
     string titular;
     double saldo;

    public void AtualizarSaldo(double valor)
    {
        this.saldo += valor;
    }
}

Enfim, as classes são o pontapé inicial para programar de forma orientada a objetos. Tanto é que existe quem defenda a mudança para “programação orientada a classes”.

Objetos

Os membros que estão sob a classificação de uma classe são os objetos. Em geral, eles representam um elemento específico de um universo maior.

Se você prestar atenção ao seu redor, muito do que você vê são objetos, não é? Livros, televisão, computador e daí por diante.

Para criar um objeto em C# usamos a palavra reservada new, assim como em outras linguagens. Aqui está um exemplo da criação de objetos:

Conta conta = new Conta();

Como você já sabe, a classe define os atributos comuns aos seus objetos. Esses atributos são, portanto, as características de um objeto. O valor de cada característica é que vai nos ajudar a diferenciar um objeto do outro.

Por exemplo, temos dois objetos do tipo “pessoa” e cada propriedade vai conter um conjunto de valores que vai nos permitir distinguir um do outro.

Pessoa andre = new Pessoa();
andre.CPF=”101.101.101-00;
andre.Nome=”André Silva”;
andre.Email=”[email protected]”;
Pessoa jose = new Pessoa();
jose.CPF=”101.101.101-00;
jose.Nome=”José Gomes”;
jose.Email=”[email protected]”;

Além do mais, existem os comportamentos de um objeto dentro de um sistema como exibir suas informações ou enviar uma mensagem.

Trocando mensagens

Um objeto, por si só, não faz muita coisa. Para uma aplicação, um objeto tem valor no momento em que ele interage com outros objetos. Ou seja, quando se comunica com eles. E essa comunicação se dá através da troca de mensagens. What?

A troca de mensagens quer dizer que vamos “invocar” um método de outro objeto. Para exemplificar, imagine que temos um objeto caio enviando uma mensagem para o objeto ana. Assim, nós podemos entender que o objeto caio invocou um método do objeto ana.

Outros conceitos da OO

Ao falar sobre OOs, alguns conceitos são centrais e dão sustentação para esse paradigma. É o que se denomina de pilares da Orientação a Objetos.

Os principais pilares são:

Ilustração de quatro pilares sustentando o termo “P.O.O. - Programação Orientada a Objetos”. À esquerda, encontram-se quatro palavras relacionadas a cada um dos pilares exibidos na imagem: Polimorfismo, Herança, Abstração e Encapsulamento.
Abstração

A abstração é uma chave para entender a OO. Acima de tudo, a abstração é um processo mental, no qual é possível extrair significados de uma situação ou problema com base em nossas experiências.

Um ponto de abstração é conseguir isolar o que é importante representar num sistema.

Imagine uma pessoa responsável por desenvolver um sistema de gestão em empresas de mármore e granito. Para entender o problema, talvez seja necessário definir entidades como bloco ou chapa, para estabelecer itens relevantes para a aplicação.

Esse é o processo de abstração. Em seu livro Design Patterns com C#, Rodrigo Gonçalves Santana apresenta uma definição interessante sobre isso:

“A abstração é o desafio de identificar características de algo do mundo real e transformá-las em uma classe. ” (SANTANA, 2020, p.5 )

Herança

A herança permite criar novas classes a partir de outras que já existem e, a partir disso, aproveitar as definições dos atributos e métodos de uma classe em outra.

Este é um mecanismo fundamental dentro da O.O., porque, a partir dele, é possível reaproveitar código.

Observe a definição da classe Funcionario.

public class Funcionario
    {
        public string Nome { get; set; }
        public string CPF { get; private set; }
        public double Salario { get; protected set; }

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

        public double GetBonificacao()
        {
            return this.Salario * 0.1;
        }

    }

No próximo trecho de código vemos a definição de uma herança em C#, com o uso do operador :.

 public class Desenvolvedor : Funcionario
    {
        public Desenvolvedor(string cpf) : base(3000, cpf)
        {
        }

        public void AumentarSalario()
        {
            this.Salario *= 0.15;
        }
   }

A classe Desenvolvedor está herdando os atributos e os métodos da classe Funcionario pelo mecanismo da herança.

A partir de agora as propriedades Nome, CPF e Salario, bem como o método GetBonificacao também existem na definição da classe Desenvolvedor.

Encapsulamento

No universo da O.O, o encapsulamento é uma habilidade do objeto de esconder seus dados ou comportamentos do mundo “exterior”.

O principal objetivo é implementar maior segurança ao código. Para isso, o encapsulamento oculta uma parte do código para que alterações em um objeto não afetem outras partes e interações do sistema.

Vamos pensar, por exemplo, na seguinte situação: o saldo de uma conta bancária. Não existe dúvida de que não se deve alterá-lo ou manipulá-lo de forma direta.

Apenas através de métodos ou propriedades, que permitem o lançamento de créditos e débitos. Olhe o exemplo:

 public class ContaCorrente
    {
        public int numeroAgencia;
        public string conta;
        public double saldo = 100;

        public string titular;

        public void Depositar(double valor)
        {
          // implementação
        }

        public bool Sacar(double valor)
        {
            // implementação
        }

        public bool Transferir(double valor, ContaCorrente destino)
        {
           // implementação
        }

    }

Na definição da classe ContaCorrente temos os campos numeroAgencia, conta e saldo que já tem 100 como valor default.

Todos estão com a visibilidade public, o que fere o princípio de encapsulamento. Afinal de contas, após a criação de um objeto do tipo ContaCorrente, existe a possibilidade de alterar o valor do campo saldo.

Os recursos de visibilidade podem solucionar esse problema. É só tornar o campo como “private” (visível apenas dentro da classe) ou “protected” (visível somente no assembly).

Para acessar, usamos métodos ou propriedades públicas. Dessa forma:

 public class ContaCorrente
    {
        private int numeroAgencia;
        public int NumeroAgencia
        {
            get { return this.numeroAgencia; }
            set {  this.numeroAgencia = value; }               
        }

        public string Conta { get; set; }

        private double saldo = 100; // campo saldo definido como privado.

        public Cliente Titular { get; set; }

        public void Depositar(double valor)
        {
            saldo += valor;
        }

        public bool Sacar(double valor)
        {
            if (valor <= saldo)
            {
                saldo -= valor;
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool Transferir(double valor, ContaCorrente destino)
        {
            if (saldo < valor)
            {
                return false;
            }
            else
            {
                Sacar(valor);
                destino.Depositar(valor);
                return true;
            }
        }

    }

Com a implementação de um nível de encapsulamento, existe maior segurança ao manipular o campo saldo. Nesse caso, existe uma campo privado com acesso através de métodos públicos. Esta é uma forma de implementar o encapsulamento, ok?

Polimorfismo

Como o próprio nome sugere, o polimorfismo significa “várias formas”. Na O.O. o polimorfismo compreende a capacidade de um objeto de se comportar de maneira distinta ao receber uma mensagem. Como, por exemplo:

public class Veiculo
{
  // definição dos campos e propriedades.

  public virtual void Mover()
    {
        Console.WriteLine("O veículo em movimento.");
    }
}

public class Carro : Veiculo
{
    public override void Mover()
    {
        Console.WriteLine("O carro em deslocamento.");
    }
}

public class Moto: Veiculo
{
    public override void Mover()
    {
        Console.WriteLine("A moto segue na pista.");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Veiculo veiculo1 = new Carro();
        Veiculo veiculo2 = new Moto();

        veiculo1.Mover(); // Chama o método Mover() da classe Carro
        veiculo2.Mover(); // Chama o método Mover() da classe Moto
    }
}

Na classe Veiculo temos um método Mover() que é polimórfico. Nele cada subclasse tem uma implementação particular.

No método Main, em tempo de execução, o programa vai chamar o método do tipo concreto da variável.

Afinal, de acordo com sua subclasse, o veículo se movimenta de maneira diferente. Esta é somente uma das formas de implementar o polimorfismo.

Para se aprofundar em programação orientada a objetos

Ouvir um pouco de:
Práticas de Orientação a Objetos – Hipsters #129

Ferramentas para desenvolver com C Sharp

Você pode começar a desenvolver em C# com um editor de texto. Pode ser até o bloco de notas do Windows. O que não pode faltar é a instalação do .NET no seu ambiente — seja ele Windows ou Linux.

Mas, programar no bloco de notas só se for estritamente necessário, ok? 🥲.

Hoje em dia, existem diversas ferramentas — entre pagas e gratuitas, para atender às necessidades. Inclusive, neste artigo falamos sobre algumas IDEs famosas no desenvolvimento C#.

Com estas ferramentas podemos editar nossos códigos, executar depurações, acessar ambientes CLI (command line interface), executar scripts, acessar e manipular base de dados, além de compilar nossa solução.

Tudo isso em um único ambiente que aumenta, de maneira exponencial, nossa produtividade no momento de criar nossas aplicações.

Visual Studio

O Visual Studio é uma IDE (ambiente integrado de desenvolvimento) criada pela Microsoft com atenção especial a plataforma .NET.

De forma geral, ele serve para desenvolver soluções de aplicativos, programas e websites, o que possibilita usar C#, Visual Basic .NET, C++, F#, Python, Javascript e muitas outras.

Como uma ferramenta voltada para a produtividade na produção de código, o Visual Studio oferece diversos recursos para ajudar as pessoas desenvolvedoras a codificar e testar de forma eficiente.

Ela também nos traz um editor de código avançado com InteliSense, que:

  • Sugere código em tempo real;
  • Oferece recursos de depuração (para identificar, analisar e corrigir código com erros);
  • Proporciona integração com sistemas de gerenciamento de versão como o Git;
  • Se integra com bibliotecas .NET para criar interfaces gráficas.

Como se não bastasse, também oferece suporte para criar projetos de área de trabalho, aplicativos mobile para iOS e Android, desenvolvimento web e nuvem.

Vale lembrar que existem diferentes edições do Visual Studio à disposição no mercado:

  • Community: uma versão gratuita para pessoas desenvolvedoras individuais e para projetos de código aberto;
  • Enterprise: esta versão traz recursos avançados para criar aplicações de grande escala;
  • Professional: ferramenta para desenvolver aplicações de forma profissional.

Como fazer download do Visual Studio

Para baixar o Visual Studio, você pode acessar a página oficial da ferramenta.

VS Code

O Visual Studio Code é o editor de códigos abertos da Microsoft, disponível no Windows, Linux e Mac.

Por se tratar de um super editor de código, você precisa instalar algumas extensões para C#.

De forma geral, ele possui suporte para várias linguagens, uma interface agradável e é simples de usar, além de ser uma ferramenta muito leve em comparação a uma IDE tradicional.

Rider

No universo das IDEs para trabalhar com C#, existe também o Rider, um produto proprietário da JetBrains.

As principais características dessa ferramenta são:

  • É cross-plataform;
  • Toma como base as ferramentas IntelliJ e o ReSharp, plugin que adiciona recursos avançados ao Visual Studio.

A refatoração, a análise de código, o autocomplementar inteligente e os testes de unidade podem ser citados como alguns desses recursos.

A imagem apresenta a interface da Rider IDE e no editor de código o comando Console.WriteLine(“Hello, World!”).

Essa interface do Rider é bastante intuitiva, tem um bom desempenho e conta com vários recursos avançados para aumentar a produtividade.

Assim, o Rider passa a ser uma alternativa bem interessante ao Visual Studio e ao VS Code.

Como fazer download do Rider

Para baixar o Rider, você pode acessar a página oficial da ferramenta.

Tipos de Projetos

O .NET disponibiliza uma estrutura gratuita, baseada em software livre e multiplataforma.

Isso permite desenvolver, testar e implantar aplicativos nos mais diversos formatos como, por exemplo, aplicações console e serviços de nuvem.

Aqui estão alguns tipos de soluções possíveis utilizando o C#.

Projeto de uma tela em três camadas, sendo a primeira a representação de um diagrama, seguida pela camada de codificação e por fim a camada de interface gráfica.

Fonte: Microsoft

Console

O console é um dos tipos de projetos mais utilizados por quem está começando a aprender .NET e linguagem C#.

Uma aplicação do tipo console é aquela que executamos em um prompt de comando.

De forma geral, é um tipo de projeto útil para criar ferramentas de linha de comando, automatizar scripts e outros aplicativos com base em texto.

Para criar um console, você pode usar a interface gráfica de uma IDE como o Visual Studio, conforme a imagem abaixo:

A imagem apresenta um recorte da janela de configuração de um projeto .NET na ferramenta do Visual Studio Community 2022, mostrando que está selecionada a opção de projeto `Aplicativo do Console`.

Existe também a opção de utilizar o CLI para criar projetos, inclusive de outros tipos, não apenas console:

C:\Users\Alura\Desktop\ProjetoConsole> dotnet new console

Para executar o projeto podemos rodar o comando dotnet run e ter como saída:

C:\Users\Alura\Desktop\ProjetoConsole> dotnet run
Hello, World!

Aplicativos de desktop

Para criar aplicativos de área de trabalho, existe o clássico Windows Forms. Com esse tipo de projeto, é possível montar a interface gráfica do aplicativo usando o conceito de “arrastar e soltar” as janelas e os componentes.

Janela de configuração de um projeto .NET na ferramenta do Visual Studio Community 2022, mostrando que está selecionada a opção de projeto`Aplicativo do Windows Form.

Com Windows Forms, você pode entregar uma solução com visual bacana e bem mais intuitivo. Tudo isso de forma rápida e configurável.

Aqui está uma imagem da tela de um projeto deste tipo no Visual Studio Community 2022.

Tela do Visual Studio Community 2022, mostrando um projeto Aplicativo do Windows Form, tendo à esquerda a caixa de ferramentas, ao centro a área de trabalho do formulário e à direita a caixa de propriedades de configuração do formulário.

Para desenvolver um aplicativo Windows Form no Visual Studio Community, existe uma caixa de ferramentas com diversos controles como, por exemplo, botões, caixa de textos, grades, menu e rótulos.

Além disso, também é possível ter uma visão de projeto na qual é possível configurar visualmente os formulários (telas) de aplicação, além de configurar elementos desses controles que podem ser adicionados ao formulário através de uma janela de propriedades.

A Microsoft também desenvolveu uma forma mais rica de criar projetos para desktop, o Windows Presentation Foundation ou simplesmente WPF.

A ideia por trás desta tecnologia é permitir a criação de interfaces mais modernas e atraentes, trazendo recursos avançados de design e interação.

O WPF utiliza a linguagem XAML (Extensible Application Markup Language) e diversos comportamentos dos controles da interface gráfica para definir a aparência. Aqui está um exemplo de código XAML para a definir um formulário:

<Window x:Class="EntendendoDotNETWpf.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EntendendoDotNETWpf"
        mc:Ignorable="d"
        Title="Usando o WPF" Height="350" Width="700">
    <Grid Margin="10,0,0,98">
        <TextBox HorizontalAlignment="Left" Margin="112,85,0,0" TextWrapping="Wrap" Text="Nome" VerticalAlignment="Top" Width="120" FontSize="18" FontWeight="Bold"/>
        <TextBox HorizontalAlignment="Left" Margin="112,128,0,0" TextWrapping="Wrap" Text="Sobrenome" VerticalAlignment="Top" Width="120" FontSize="18" FontWeight="Bold"/>
        <TextBox HorizontalAlignment="Left" Margin="237,85,0,0" TextWrapping="Wrap" Text="...digite seu nome" VerticalAlignment="Top" Width="362" FontSize="18"/>
        <TextBox HorizontalAlignment="Left" Margin="237,128,0,0" TextWrapping="Wrap" Text="...digite seu sobrenome" VerticalAlignment="Top" Width="362" FontSize="18"/>
        <Button HorizontalAlignment="Left" Margin="495,159,0,0" VerticalAlignment="Top" Height="41" Width="104" FontSize="18" FontWeight="Bold">
            <StackPanel Orientation="Horizontal">
                <Image Source="./assets/salvar.png" Width="16" Height="16" Margin="0,0,5,0"/>
                <TextBlock Text="Salvar" VerticalAlignment="Center"/>
            </StackPanel>
        </Button>

        <Button HorizontalAlignment="Left" Margin="386,159,0,0" VerticalAlignment="Top" Height="41" Width="104" FontSize="18" FontWeight="Bold">
            <StackPanel Orientation="Horizontal">
                <Image Source="./assets/sair.png" Width="16" Height="16" Margin="0,0,5,0"/>
                <TextBlock Text="Cancelar" VerticalAlignment="Center"/>
            </StackPanel>
        </Button>

    </Grid>
</Window>

Como saída, terá a renderização da janela visual, como na seguinte imagem:

Tela do Visual Studio Community 2022, mostrando um projeto aplicativo do Windows WPF, tendo à esquerda a caixa de ferramentas, ao centro a área de trabalho do formulário e à direita a caixa de propriedades de configuração do formulário.

Aplicativos da web

Para desenvolver aplicações específicas para a web, a Microsoft trouxe a plataforma ASP.NET.

O nome ASP é uma abreviação de **Active Server Pages***, o que significa “páginas de servidor ativo”, em uma tradução livre. Ou seja, páginas geradas por meio dos servidores web.

Com o ASP.NET, é possível entregar soluções como websites, aplicativos web (WebApps), Serviços web, APIs, dentre outros.

De forma geral, a plataforma se baseia na arquitetura cliente-servidor, de acordo com o código que o servidor executa antes de enviar a resposta ao navegador da pessoa usuária.

Isso confere maior dinamicidade e interatividade, além de proporcionar a implementação de recursos avançados, como autenticação/autorização, gerenciamento de sessões, banco de dados e formulários.

Dentro do ASP.NET, o desenvolvimento de aplicações compreende incluir o padrão arquitetural MVC (Model-View-Controller).

De acordo com ele, é possível estruturar nossos projetos em lógica de negócios (Model), apresentação dos dados(View) e interação (Controlller).

Quer dizer, é uma abordagem que permite evoluir e testar códigos de maneira simples.

Para exemplificar o ASP.NET, vou apresentar, de forma breve, como criar um projeto do tipo “Aplicativo Web ASP.NET Core” que, dentre outras características, é de código aberto e multiplataforma:

Projeto .NET na ferramenta do Visual Studio Community 2022, mostrando que está selecionada a opção de projeto `Aplicativo Web ASP.NET Core`.

É necessário escolher o projeto ASP.NET (pois temos as opções WebAPI, ASP.NET MVC, dentre outras).

Depois de fazer as configurações necessárias, você já pode criar de maneira simples a primeira WebApp, como nessa imagem:

Janela do Gerenciador de Soluções do Visual Studio Community 2022, com foco na estrutura básica de um projeto de WebApp do ASP.NET .

Depois de criar e executar o projeto, o framework já inicia um servidor Web para rodar nossa aplicação.

A imagem apresenta uma página de boas vindas com os dizeres `Boas vindas - Aprendendo ASP.NET` e ao fundo uma janela de prompt com o log de execução do servidor web.

Ainda sobre a plataforma ASP.NET, é interessante destacar o Blazor, mais um framework criado pela Microsoft focado em Web.

Já imaginou desenvolver um front-end com C#?

O Blazor permite desenvolver aplicações web interativas usando C#, além de criar aplicações de página única, as famosas SPA (single page application).

Através dele, temos uma lógica de aplicativo tanto do lado da pessoa cliente quanto do servidor utilizando o .NET.

Então, a grande vantagem do Blazer é executar o código de uma linguagem pelo lado da pessoa cliente. Ou seja, diretamente no navegador.

Assim, é possível usar o C# para desenvolver aplicações, que seriam desenvolvidas em Javascript.

Aqui está um exemplo da visão de um código de um projeto Blazor, exibindo uma razor page, view engine do ASP.NET para criação de visões (páginas):

@page "/counter"

<PageTitle>Contador</PageTitle>

<h1>Contador</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click Aqui</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

Para se aprofundar mais em ASP.NET, você pode conferir os seguintes links:

Mobile

Desde o seu lançamento, a plataforma .NET oferece soluções para o desenvolvimento mobile.

Já tivemos o .NET Compact Framework, o Windows Phone que utiliza a plataforma .NET e o uso de XAML para criar interface com a pessoa usuária.

Em 2011, surgiu o Xamarin, que é presente até hoje. O Xamarin é um dos frutos do projeto Mono, que tinha como objetivo possibilitar a execução de aplicações .NET na plataforma Linux. Neste contexto, o Xamarin nasceu como foco em ser multiplataforma.

No ano de 2016 a Microsoft comprou a Xamarin e a incorporou ao Visual Studio 2017.

Assim, a ferramenta passou a ter suporte nativo para as plataformas Android ou iOS usando a linguagem C#.

As principais características do Xamarin são:

  • Multiplataforma: pessoas desenvolvedoras podem escrever aplicativos móveis nativos para a plataforma, otimizando a utilização de recursos e o desempenho de cada sistema operacional;
  • Xamarin.Forms: uma biblioteca de interfaces compartilhada entre as plataformas iOS, Android e Windows;
  • APIs Nativa: com o Xamarin, é possível ter acesso às APIs nativas da plataforma, criando um ambiente com alto grau de integração;
  • Xamarin Test Cloud: como parte do Visual Studio App Center, serviço da Microsoft que permite testar aplicativos Xamarin em dispositivos reais.

Desse modo, o Xamarin é uma plataforma poderosa para o desenvolvimento de aplicativos .NET Mobile, por possibilitar a implementação de código nativo.

Para saber mais sobre o Xamarin, acesse a definição da Microsoft.

Ou, se preferir, ouça o podcast Xamarin: Desenvolvimento multiplataforma – Hipsters Ponto Tech #19, disponível abaixo:

Ouvir um pouco de:
Xamarin: Desenvolvimento multiplataforma – Hipsters #19

Desde 2021 a Microsoft desenvolve o NET MAUI, Multi-platform App UI.

Em resumo, o MAUI é uma evolução do Xamarin.Forms e permite desenvolver aplicativos multiplataforma para iOS, Android, macOS e Windows utilizando C# e o .NET.

Ao gerar uma única base de código para a criação de interfaces de usuário compartilhadas, o objetivo do MAUI é unificar a experiência de devs.

Dessa forma, essa base de código é única para diferentes plataformas também. Olha só esse exemplo de HelloWorld:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage">
    <ScrollView>
        <VerticalStackLayout
            Spacing="25"
            Padding="30,0"
            VerticalOptions="Center">

            <Image
                Source="dotnet_bot.png"
                SemanticProperties.Description="Cute dot net bot waving hi to you!"
                HeightRequest="200"
                HorizontalOptions="Center" />

            <Label
                Text="Olá Pessoal! Utilizando o .NET MAUI!"
                SemanticProperties.HeadingLevel="Level1"
                FontSize="32"
                HorizontalOptions="Center" />

            <Label
                Text="Bem vindo a plataforma."
                SemanticProperties.HeadingLevel="Level2"
                SemanticProperties.Description="Welcome to dot net Multi platform App U I"
                FontSize="18"
                HorizontalOptions="Center" />
            <Button
                x:Name="CounterBtn"
                Text="Click me"
                SemanticProperties.Hint="Counts the number of times you click"
                Clicked="OnCounterClicked"
                HorizontalOptions="Center" />
        </VerticalStackLayout>
    </ScrollView>

</ContentPage>

A saída deste código XALM é essa tela:

Janela no desktop com o HelloWorld de uma aplicação .NET MAUI.

É importante ressaltar que no universo mobile .NET, ainda temos o UWP, Universal Windows Plataform. que serve para desenvolvimento móvel de PCs até Xbox.

Já o Blazor Mobile usa o Blazor para entregar soluções em aplicativos móveis.

Para se aprofundar mais no desenvolvimento móvel em .NET, dê uma conferida nos links abaixo:

Certificações

Para continuar a progredir profissionalmente, a pessoa desenvolvedora deve estar em constante atualização, seja por meio de cursos, bootcamps, leitura etc. No universo da tecnologia, também existem as certificações para dar um “Up” na carreira.

Possuir certificações pode ser um diferencial no currículo, uma vez que algumas posições de mercado podem colocá-las como requisito para vagas 😉.

Na programação, em especial, é importante ter uma forma de atestar para empresas a nossa capacidade e conhecimento no trabalho com uma linguagem ou mesmo framework.

Vale a pena fazer uma certificação? #HipstersPontoTube

A Microsoft, por exemplo, oferta algumas provas de certificações que são reconhecidas e valorizadas pelo mercado. Ser um profissional certificado pela Microsoft pode ser uma grande vantagem para aqueles que buscam emprego ou desejam aprimorar suas habilidades e currículos.

Uma novidade interessante é a de que recentemente a Microsoft anunciou uma certificação de fundamentos do C# em parceria com a freeCodeCamp.

O melhor de tudo é que é uma certificação gratuita. Nesta iniciativa, a pessoa interessada executa uma série de treinamentos e exercícios em texto pelo site Microsoft Lean.

Card da certificação Foundational C# Certification. Na medida em que você concluir os módulos e evoluir no treinamento, adquire troféus que serão utilizados nos módulos de atividades dentro da plataforma da freeCodeCamp. Recorte de um perfil de treinamento do site da Microsoft Learn, com destaque para os troféus. Dentro do site da freeCodeCamp você encontra 6 módulos de atividades, que correspondem aos treinamentos realizados no site da Microsoft. Ao final de cada um deles, você vincula o seu troféu. A imagem mostra um recorte da plataforma freeCodeCamp no módulo de atividade do curso Write Your First Code Using C# com o destaque para a opção do troféu. Após a realização de cada módulo, o site libera o link para fazer a prova online de certificação, que consiste em um total de 80 questões de múltipla escolha. O requisito de aprovação é obter um total de 70% de acertos. A imagem apresenta um recorte da plataforma do freeCodeCamp mostrando a seção do exame de certificação para a prova Foundational C# With Microsoft.

Com esta certificação, a pessoa pode atestar seus conhecimentos fundamentais da linguagem C# por meio de exercícios práticos. Ou seja, por meio de projetos. Assim, desenvolve habilidades para criar aplicativos nesta linguagem.

A imagem apresenta o certificado adquirido ao final da prova de certificação Foundational C# With Microsoft.

Para saber mais sobre as certificações para o ecossistema .NET, consulte o site do Microsoft Learn.

Confira também o link a respeito de certificações de alunos.

Como aprender sobre C# e .NET de forma gratuita

Você pode acessar as primeiras aulas da Formação C# e orientação a objetos, da Escola de Programação da Alura e continuar aprendendo sobre temas como:

  1. C#: criando sua primeira aplicação
  2. C#: aplicando a Orientação a Objetos
  3. C#: dominando Orientação a Objetos
  4. C#: consumindo API, gravando arquivos e utilizando o LINQ

Como aprender melhor? Com Diogo Pires | #HipstersPontoTube

Apostilas de C# da Alura

Mergulhe na Apostila: C# e Orientação a Objetos e aprenda tópicos importantes como:

  1. Como aprender C#;
  2. O que é C# e .Net;
  3. Variáveis e tipos primitivos;
  4. Estruturas de controle;
  5. Estruturas de repetição;
  6. Classes e objetos;
  7. Encapsulamento e Modificadores de Acesso;
  8. Construtores;
  9. Introdução ao Visual Studio com Windows Form;
  10. Herança;
  11. Cadastro de novas contas;
  12. Classes abstratas;
  13. Interfaces;
  14. Métodos e atributos estáticos;
  15. Exceções;
  16. Namespaces;
  17. Classe Object;
  18. Trabalhando com listas;
  19. Lidando com conjuntos;
  20. System.IO;
  21. Manipulação de strings;
  22. Apêndice — estendendo comportamentos através de métodos extras.

Como fazer download das apostilas?

Faça download das apostilas completas em: Apostilas da Alura - Conteúdo livre para o seu aprendizado

Conclusão

Neste artigo, exploramos alguns dos fundamentos da linguagem de programação C#, passando por temas como tipagem, sua sintaxe, que entrega uma curva de aprendizagem muito suave para iniciantes.

Vimos que o C# é uma linguagem orientada a objetos, o principal paradigma do mercado. Não deixamos de comentar também sobre as ferramentas que podem dar suporte no trabalho com a linguagem, como o.NET.

O C# é uma linguagem que está em alta no mercado, em constante evolução com a adição de novos recursos por parte da Microsoft. Não é à toa que, há alguns anos, consolidou-se como umas das principais linguagens de propósito geral.

Quer se aprofundar ainda mais na tecnologia C#? Aqui estão algumas referências para te ajudar:

André Bessa
André Bessa

Eu sou programador e instrutor de programação usando C# e .NET. Formado em Sistemas de Informação. já programei usando Java, PHP,C#, PostgreSQL e MySQL, além de já ter atuado com suporte também. Buscando sempre aprender mais sobre tecnologias.Hobbies são gibis e séries.

Veja outros artigos sobre Programação