Share via


Um tour pela linguagem C#

A linguagem C# é a linguagem mais popular para a plataforma .NET, um ambiente de desenvolvimento gratuito, 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 todos os outros lugares. Você pode escrever aplicativos para telefones, desktops e laptops e servidores.

O C# é uma linguagem de uso geral multiplataforma que torna os desenvolvedores produtivos ao escrever um 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. Com base em princípios orientados a objetos, ele incorpora muitos recursos de outros paradigmas, especialmente a programação funcional. Recursos de baixo nível dão suporte a cenários de alta eficiência sem escrever código não seguro. A maioria dos runtimes e bibliotecas do .NET são escritos em C# e avanços no C# geralmente beneficiam todos os desenvolvedores do .NET.

Hello world

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

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

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

O exemplo anterior mostra uma forma de programa "Hello, World", usando instruções de nível superior. 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, conforme mostrado no exemplo a seguir:

using System;

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

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

A classe Hello declarada pelo programa "Hello, World" tem um único membro, o método chamado Main. O método Main é declarado com o modificador static. Embora os métodos de instância possam fazer referência a uma determinada instância de objeto delimitador usando a palavra-chave this, 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 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 e o método que o contém para o ponto de entrada do programa.

Dica

Os exemplos neste artigo fornecem uma primeira visão do 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 de 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#

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 necessário 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 .NET SDK. Alguns componentes são independentes de plataforma, como bibliotecas de sistemas de arquivos, coleções de dados e bibliotecas matemáticas. Outras são específicas para uma única carga de trabalho, como as bibliotecas 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 de linguagens C. A sintaxe C# é familiar se você usou C, C++, JavaScript ou Java. Como todas as linguagens da família C, ponto e vírgula (;) definem o final das instruções. Os identificadores C# diferenciam maiúsculas de minúsculas. C# tem o mesmo uso de colchetes, { e }, instruções de controle como if, else e switch, e construções de loop como for, e while. C# também possui uma instrução foreach para qualquer tipo de coleção.

C# é uma linguagem fortemente tipada. Cada variável que você declara possui um tipo conhecido em tempo de compilação. O compilador ou ferramentas de edição informam se você está usando esse tipo incorretamente. Você pode corrigir esses erros antes mesmo de executar o programa. Tipos de dados fundamentais são integrados à 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. Ao escrever 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 modificador record aos tipos struct ou class para que o compilador sintetize o código para comparações de igualdade. Você também pode criar definições interface, 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. Genéricos usam parâmetros de tipo para fornecer um espaço reservado para um tipo real quando usados.

Ao escrever o código, você define funções, também chamadas de métodos, como membros dos tipos struct e class. Esses métodos definem o comportamento dos seus tipos. Os métodos podem estar 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 C# podem definir events, que permitem que um tipo notifique os assinantes sobre ações importantes. C# oferece suporte a técnicas orientadas a objetos, como herança e polimorfismo para tipos class.

Os aplicativos C# usam exceções para relatar e tratar 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 consegue fazer o que foi planejado. Outro código, não importa quantos níveis subam na pilha de chamadas, pode opcionalmente ser recuperado usando um bloco try - catch.

Recursos distintos do C#

Alguns elementos do C# podem ser menos familiares. Consulta integrada de linguagem (LINQ) fornece uma sintaxe comum baseada em padrões para consultar ou transformar qualquer coleção de dados. 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 a seguir 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 por 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 parece ser executado de forma síncrona, mesmo que seja executado de forma assíncrona. Ele utiliza as palavras-chave async e await para descrever métodos assíncronos 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 for concluída, o método retornará 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;
}

C# também oferece suporte a uma instrução await foreach 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 estiver 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 coleção usando uma instrução await foreach:

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

C# fornece correspondência de padrões. Essas expressões permitem inspecionar dados e tomar decisões com base em suas características. A correspondência de padrões fornece uma ótima sintaxe para fluxo de controle baseado em dados. O código a seguir mostra como os métodos para as operações booleanas e, or e xor podem ser expressos usando a 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 resumo para qualquer valor. O exemplo a seguir mostra como você pode simplificar os métodos e:

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 avançada de C#, incluindo o código que você escreve. Eles também fornecem recursos de depuração.