Partilhar via


Um tour pela linguagem C#

A linguagem C# é a linguagem mais popular para a plataforma .NET, um ambiente de desenvolvimento livre, multiplataforma e de código aberto. Os programas C# podem ser executados em muitos dispositivos diferentes, desde dispositivos de Internet das Coisas (IoT) até a nuvem e em todos os lugares intermediários. Você pode escrever aplicativos para telefone, desktop e laptops e servidores.

C# é uma linguagem de uso geral multiplataforma que torna os desenvolvedores produtivos enquanto escrevem código de alto desempenho. Com milhões de desenvolvedores, o C# é a linguagem .NET mais popular. O C# tem amplo suporte no ecossistema e em todas as cargas de trabalho do .NET. Baseado em princípios orientados a objetos, incorpora muitas características de outros paradigmas, não menos importante programação funcional. Recursos de baixo nível suportam cenários de alta eficiência sem escrever código inseguro. A maioria do tempo de execução e das bibliotecas do .NET são escritos em C#, e os avanços em C# geralmente beneficiam todos os desenvolvedores do .NET.

Hello world

O programa "Hello, World" é tradicionalmente usado para introduzir uma linguagem de programação. Aqui está em C#:

// This line prints "Hello, World" 
Console.WriteLine("Hello, World");

A linha que começa com // é um comentário de linha única. Os comentários de linha única em C# começam com // e continuam até o final da linha atual. C# também suporta comentários de várias linhas. Os comentários de várias linhas começam com /* e terminam com */. O WriteLine método da Console classe, que está no System namespace, produz a saída do programa. Essa classe é fornecida pelas bibliotecas de classe padrão, que, por padrão, são automaticamente referenciadas em cada programa C#.

O exemplo anterior mostra uma forma de um programa "Hello, World", usando instruções de nível superior. As versões anteriores do C# exigiam que você definisse o ponto de entrada do programa em um método. Esse formato ainda é válido e você o verá em muitos exemplos de C# existentes. Você também deve estar familiarizado com este formulário, como mostrado no exemplo a seguir:

using System;

class Hello
{
    static void Main()
    {
        // This line prints "Hello, World" 
        Console.WriteLine("Hello, World");
    }
}

Esta versão mostra os blocos de construção que você usa em seus programas. O programa "Hello, World" começa com uma using diretiva que faz referência ao System namespace. Os namespaces fornecem um meio hierárquico de organizar programas e bibliotecas em C#. Os namespaces contêm tipos e outros namespaces — por exemplo, o System namespace contém muitos tipos, como a Console classe referenciada no programa, e muitos outros namespaces, como IO e Collections. Uma using diretiva que faz referência a um determinado namespace permite o uso não qualificado dos tipos que são membros desse namespace. Por causa da diretiva, o programa pode usar Console.WriteLine como taquigrafia using para System.Console.WriteLine. No exemplo anterior, esse namespace foi incluído implicitamente .

A Hello classe declarada pelo programa "Hello, World" tem um único membro, o método chamado Main. O Main método é declarado com o static modificador. Enquanto os métodos de instância podem fazer referência a uma instância de objeto de compartimentação específica usando a palavra-chave this, os métodos estáticos operam sem referência a um objeto específico. Por convenção, quando não há instruções de nível superior, um método estático chamado Main serve como o ponto de entrada de um programa C#.

Ambos os formulários de ponto de entrada produzem código equivalente. Quando você usa instruções de nível superior, o compilador sintetiza a classe que contém e o método para o ponto de entrada do programa.

Gorjeta

Os exemplos neste artigo dão uma primeira olhada no código C#. Alguns exemplos podem mostrar elementos de C# com os quais você não está familiarizado. Quando estiver pronto para aprender C#, comece com nossos tutoriais para iniciantes ou mergulhe nos links em cada seção. Se você tem experiência em Java, JavaScript, TypeScript ou Python, leia nossas dicas para ajudá-lo a encontrar as informações necessárias para aprender C# rapidamente.

Recursos familiares do C#

O C# é acessível para iniciantes, mas oferece recursos avançados para desenvolvedores experientes que escrevem aplicativos especializados. Você pode ser produtivo rapidamente. Você pode aprender técnicas mais especializadas conforme precisar delas para suas aplicações.

Os aplicativos C# se beneficiam do gerenciamento automático de memória do .NET Runtime. Os aplicativos C# também usam as extensas bibliotecas de tempo de execução fornecidas pelo SDK do .NET. Alguns componentes são independentes da plataforma, como bibliotecas de sistemas de arquivos, coleções de dados e bibliotecas matemáticas. Outros são específicos para uma única carga de trabalho, como as bibliotecas da Web ASP.NET Core ou a biblioteca .NET MAUI UI. Um rico ecossistema de código aberto no NuGet aumenta as bibliotecas que fazem parte do tempo de execução. Essas bibliotecas fornecem ainda mais componentes que você pode usar.

C# está na família C de idiomas. A sintaxe C# é familiar se você tiver usado C, C++, JavaScript ou Java. Como todas as línguas da família C, ponto-e-vírgula (;) definem o final das declarações. Os identificadores C# diferenciam maiúsculas de minúsculas. C# tem o mesmo uso de chaves, { e }instruções de controle como if, else e switch, e construções de looping como for, e while. C# também tem uma foreach instrução para qualquer tipo de coleção.

C# é uma linguagem fortemente tipada . Cada variável que você declara tem um tipo conhecido em tempo de compilação. O compilador ou as ferramentas de edição informam se você está usando esse tipo incorretamente. Você pode corrigir esses erros antes de executar o programa. Os tipos de dados fundamentais são incorporados à linguagem e ao tempo de execução: tipos de valor como int, double, char, tipos de referência como string, matrizes e outras coleções. À medida que você escreve seus programas, você cria seus próprios tipos. Esses tipos podem ser struct tipos para valores ou class tipos que definem o comportamento orientado a objetos. Você pode adicionar o record modificador a um ou class tipos struct para que o compilador sintetize o código para comparações de igualdade. Você também pode criar interface definições, que definem um contrato ou um conjunto de membros, que um tipo que implementa essa interface deve fornecer. Você também pode definir tipos e métodos genéricos. Os genéricos usam parâmetros de tipo para fornecer um espaço reservado para um tipo real quando usado.

Ao escrever código, você define funções, também chamadas de métodos, como membros de struct e class tipos. Esses métodos definem o comportamento de seus tipos. Os métodos podem ser sobrecarregados, com diferentes números ou tipos de parâmetros. Os métodos podem, opcionalmente, retornar um valor. Além dos métodos, os tipos C# podem ter propriedades, que são elementos de dados apoiados por funções chamadas acessadores. Os tipos de C# podem definir eventos, que permitem que um tipo notifique os assinantes sobre ações importantes. O C# suporta técnicas orientadas a objetos, como herança e polimorfismo para class tipos.

Os aplicativos C# usam exceções para relatar e manipular erros. Você estará familiarizado com essa prática se tiver usado C++ ou Java. Seu código lança uma exceção quando não pode fazer o que foi planejado. Outro código, não importa quantos níveis acima da pilha de chamadas, pode opcionalmente recuperar usando um try - catch bloco.

Recursos distintos do C#

Alguns elementos do C# podem ser menos familiares. Language Integrated query (LINQ) fornece uma sintaxe comum baseada em padrões para consultar ou transformar qualquer coleção de dados. O LINQ unifica a sintaxe para consultar coleções na memória, dados estruturados como XML ou JSON, armazenamento de banco de dados e até mesmo APIs de dados baseadas em nuvem. Você aprende um conjunto de sintaxe e pode pesquisar e manipular dados independentemente de seu armazenamento. A consulta seguinte encontra todos os alunos cuja média de notas é superior a 3,5:

var honorRoll = from student in Students
                where student.GPA > 3.5
                select student;

A consulta anterior funciona para muitos tipos de armazenamento representados pelo Students. Pode ser uma coleção de objetos, uma tabela de banco de dados, um blob de armazenamento em nuvem ou uma estrutura XML. A mesma sintaxe de consulta funciona para todos os tipos de armazenamento.

O modelo de programação assíncrona baseado em tarefas permite que você escreva código que lê como se fosse executado de forma síncrona, mesmo que seja executado de forma assíncrona. Ele utiliza as palavras-chave e await para descrever métodos que são assíncronos async e quando uma expressão é avaliada de forma assíncrona. O exemplo a seguir aguarda uma solicitação da Web assíncrona. Quando a operação assíncrona é concluída, o método retorna o comprimento da resposta:

public static async Task<int> GetPageLengthAsync(string endpoint)
{
    var client = new HttpClient();
    var uri = new Uri(endpoint);
    byte[] content = await client.GetByteArrayAsync(uri);
    return content.Length;
}

O C# também suporta uma await foreach instrução para iterar uma coleção apoiada por uma operação assíncrona, como uma API de paginação GraphQL. O exemplo a seguir lê dados em partes, retornando um iterador que fornece acesso a cada elemento quando ele está disponível:

public static async IAsyncEnumerable<int> ReadSequence()
{
    int index = 0;
    while (index < 100)
    {
        int[] nextChunk = await GetNextChunk(index);
        if (nextChunk.Length == 0)
        {
            yield break;
        }
        foreach (var item in nextChunk)
        {
            yield return item;
        }
        index++;
    }
}

Os chamadores podem iterar a coleta usando uma await foreach instrução:

await foreach (var number in ReadSequence())
{
    Console.WriteLine(number);
}

O C# fornece correspondência de padrões. Essas expressões permitem que você inspecione dados e tome decisões com base em suas características. A correspondência de padrões fornece uma ótima sintaxe para o fluxo de controle com base nos dados. O código a seguir mostra como os métodos para as operações booleanas e, or e xor podem ser expressos usando sintaxe de correspondência de padrões:

public static bool Or(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

public static bool And(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (true, false) => false,
        (false, true) => false,
        (false, false) => false,
    };
public static bool Xor(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => false,
        (true, false) => true,
        (false, true) => true,
        (false, false) => false,
    };

As expressões de correspondência de padrões podem ser simplificadas usando _ como um catch all para qualquer valor. O exemplo a seguir mostra como você pode simplificar o método and :

public static bool ReducedAnd(bool left, bool right) =>
    (left, right) switch
    {
        (true, true) => true,
        (_, _) => false,
    };

Finalmente, como parte do ecossistema .NET, você pode usar o Visual Studio ou o Visual Studio Code com o C# DevKit. Essas ferramentas fornecem uma compreensão rica do C#, incluindo o código que você escreve. Eles também fornecem recursos de depuração.