Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
C# está na família C de idiomas.
A sintaxe é familiar se utilizaste C, C++, JavaScript, TypeScript ou Java. Como C e 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 chaves, {
e }
, instruções de controle como if
, else
e switch
, e construções de laços como for
e while
. C# também tem um foreach
comando para qualquer tipo de coleção.
Olá, mundo
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 uma única linha. 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#. Outro formulário de programa requer que você declare a classe que contém e o método para o ponto de entrada do programa. O compilador sintetiza esses elementos quando você usa instruções de nível superior.
Este formato alternativo ainda é válido e contém muitos dos conceitos básicos em todos os programas C#. Muitos exemplos de C# existentes usam o seguinte formato equivalente:
using System;
namespace TourOfCsharp;
class Program
{
static void Main()
{
// This line prints "Hello, World"
Console.WriteLine("Hello, World");
}
}
O programa "Hello, World" anterior começa com uma diretiva using
que faz referência ao namespace System
. 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 using
, o programa pode usar Console.WriteLine
como abreviação para System.Console.WriteLine
. No exemplo anterior, esse namespace foi incluído implicitamente .
A Program
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#. A classe que contém o método Main
é normalmente chamada Program
.
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, TypeScriptou Python, leia nossas dicas para ajudá-lo a encontrar as informações necessárias para aprender C# rapidamente.
Programas baseados em ficheiros
C# é uma linguagem compilada . Na maioria dos programas C#, você usa o dotnet build
comando para compilar um grupo de arquivos de origem em um pacote binário. Em seguida, use o dotnet run
comando para executar o programa. (Você pode simplificar esse processo porque dotnet run
compila o programa antes de executá-lo, se necessário.) Essas ferramentas suportam uma linguagem rica de opções de configuração e opções de linha de comando. A dotnet
interface de linha de comando (CLI), que está incluída no SDK do .NET, fornece muitas ferramentas para gerar e modificar arquivos C#.
A partir do C# 14 e do .NET 10, você pode criar programas baseados em arquivos, o que simplifica a criação e a execução de programas em C#. Use o dotnet run
comando para executar um programa contido em um único *.cs
arquivo. Por exemplo, se o código a seguir estiver armazenado em um arquivo chamado hello-world.cs
, você poderá executá-lo digitando dotnet run hello-world.cs
:
#!/usr/local/share/dotnet/dotnet run
Console.WriteLine("Hello, World!");
A primeira linha do programa contém a #!
sequência para shells Unix. A localização da dotnet
CLI pode variar em diferentes distribuições. Em qualquer sistema unix, se você definir a permissão executar (+x
) em um arquivo C#, poderá executar o arquivo C# a partir da linha de comando:
./hello-world.cs
A origem desses programas deve ser um único arquivo, mas caso contrário, toda a sintaxe C# é válida. Você pode usar programas baseados em arquivo para pequenos utilitários de linha de comando, protótipos ou outros experimentos.
Funcionalidades 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# é 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 avisam se estás a usar 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 modificador record
aos tipos struct
ou class
para que o compilador sintetize 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. Essa prática é familiar se você usou 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.
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,
};
Os exemplos anteriores também declaram tuplas , que são estruturas de dados leves. Um tuplo é uma sequência ordenada, de comprimento fixo, de valores com nomes opcionais e tipos individuais. Coloque a sequência nos caracteres (
e )
. A declaração (left, right)
define uma tupla com dois valores booleanos: left
e right
. Cada braço do interruptor declara um valor em forma de tupla, como (true, true)
. As tuplas fornecem sintaxe conveniente para declarar um único valor com vários valores.
Expressões de coleção fornecem uma sintaxe comum para disponibilizar valores de coleção. Você escreve valores ou expressões entre [
e ]
caracteres e o compilador converte essa expressão para o tipo de coleção necessário:
int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
List<string> names = ["Alice", "Bob", "Charlie", "David"];
IEnumerable<int> moreNumbers = [.. numbers, 11, 12, 13];
IEnumerable<string> empty = [];
O exemplo anterior mostra diferentes tipos de coleção que podem ser inicializados usando expressões de coleção. Um exemplo usa a expressão de coleção vazia []
para declarar uma coleção vazia. Outro exemplo usa o elemento ..
spread para expandir uma coleção e adicionar todos os seus valores à expressão de coleção.
Você pode usar expressões de índice e de intervalo para recuperar um ou mais elementos de uma coleção indexável.
string second = names[1]; // 0-based index
string last = names[^1]; // ^1 is the last element
int[] smallNumbers = numbers[0..5]; // 0 to 4
O índice ^
indica do final e não desde o início. O elemento ^0
é um após o final da coleção, então ^1
é o último elemento. O ..
em uma expressão de intervalo denota o intervalo de elementos a serem incluídos. O intervalo começa com o primeiro índice e inclui todos os elementos até, mas não incluindo, o elemento no último índice.
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 async
e await
para descrever métodos que são 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 é 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);
}
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.