C# 9.0 - Programas top-level e Pattern Matching \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 13 Horas 

 55 Min 

 42 Seg 

   Tempo restante da oferta: 13 55 42 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) C# 9.0 - Programas top-level e Pattern Matching  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

# C# 9.0 - Programas top-level e Pattern Matching

 Dando continuidade ao nosso estudo do C# 9.0, neste artigo veremos dois novos recursos dele: Programas top-leve e Pattern Matching.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/11/C-SHARP-PROPRIEDADES-INIT-RECORD.png)  

Dando continuidade a nossa série de posts sobre os novos recursos do [C# 9.0](https://www.treinaweb.com.br/blog/tag/c-9-0/). No artigo passado vimos as [propriedades init e records (registros)](https://www.treinaweb.com.br/blog/c-9-0-propriedades-init-e-record/) e agora conheceremos mais dois: programas top-level e as melhorias do [pattern matching](https://www.treinaweb.com.br/blog/pattern-matching-no-csharp-7/).

## Programas Top-level

Antes da versão 9.0, para escrever qualquer código no C# era necessário declarar ao menos uma classe, com um método `Main` estático. Como no famoso “*Hello World*” abaixo:

```csharp
using System;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World");
    }
}

```

Quem nunca viu um código na vida, pode ter dificuldade em compreender todos os conceitos utilizados no código acima. Para ajudar nisso, no C# 9.0 foi introduzido os programas top-level, que não necessitam de classe nem do método `Main` para serem executados.

Com os programas top-level, o famoso “*Hello World*” pode ser definido da seguinte forma:

```csharp
using System;

Console.WriteLine("Hello World");

```

Qualquer expressão válida do C# pode ser declarada em um programa top-level, com a limitação que isso só pode ser definido em um arquivo de código. Mesmo que o programa declare uma função:

```csharp
using System;

int Soma(int var1, int var2) {
  return var1 + var2;
}

Console.WriteLine(Soma(10, 20));

```

Ela só pode ser utilizada dentro do arquivo onde foi criada. Será gerado um erro se for invocada fora dele.

Também é importante ressaltar que os usings sempre devem ser as instruções iniciais do código. Caso estiverem no meio dele, será gerado um erro.

Por fim, os programas top-level definem a variável global `args`, que contém os argumentos passados via linha de comando e podem retornar um valor para o sistema operacional:

```csharp
using static System.Console;

WriteLine(args[0]);

return 0;

```

O valor retornado indica se o programa finalizou com sucesso ou não. Lembrando que qualquer valor diferente de zero indica que o programa foi finalizado devido a um erro.

## Melhorias no pattern matching

O [pattern matching foi introduzido no C# 7.0](https://www.treinaweb.com.br/blog/pattern-matching-no-csharp-7/) como uma forma de facilitar a verificação do tipo de dado de uma variável. Na versão 8.0, com a [introdução das Switch Expressions](https://www.treinaweb.com.br/blog/switch-expressions-no-c-8-0/) este recurso recebeu suas primeiras melhorias e agora na nona versão, novos recursos foram incorporados ao padrão.

Antes, quando o pattern matching é aplicado em uma switch expression:

```csharp
public double CustoObra(object item) 
{
    return item switch
    {
        Formato t when t.Area < 100 => Area * 1.8,
        Formato t when t.Area > 200 => Area * 1.5,
        Formato _ => Area * 2.0,
    };
}

```

Era necessário informar um identificador, mesmo que fosse descartado (`_`), agora isso não é necessário:

```csharp
public double CustoObra(object item) 
{
    return item switch
    {
        Formato t when t.Area < 100 => Area * 1.8,
        Formato t when t.Area > 200 => Area * 1.5,
        Formato => Area * 2.0,
    };
}

```

Quando se está aplicando condições a mesma propriedade como no exemplo acima, podemos utilizar o relational pattern e utilizar apenas os condicionais no switch:

```csharp
public double CustoObra(Formato item) 
  => Formato t when t.Area switch
  	{
        < 100 => Area * 1.8,
        > 200 => Area * 1.5,
        _ => Area * 2.0,
    };

```

Que também pode receber os operadores lógicos `or`, `and` e `not`:

```csharp
public double CustoObra(Formato item) 
  => Formato t when t.Area switch
  	{
        > 0 and  Area * 1.8,
        > 100 and  Area * 1.6,
        > 200 => Area * 1.5,
        _ => Area * 2.0,
    };

```

Sempre que possível, opte pelo operador `not`, em detrimento de `!`, já que o primeiro melhora a legibilidade do código. Ele pode ser utilizado para verificar se um valor não é nulo:

```csharp
public Formato SelecionarFormato(object item) 
		=> item switch
    {
        FormatoPlanta.Quadrado => new Quadrado(Largura, Altura),
        FormatoPlanta.Retangulo => new Retangulo(Largura, Altura),
        FormatoPlanta.Triangulo => new Triangulo(Largura, Altura, 2),
        not null => throw new ArgumentException("Formato desconhecido"),
        null => throw new ArgumentNullException(nameof(item))
    };

```

Ou mesmo para analisar o tipo de uma variável:

```csharp
if (item is not FormatoPlanta) { throw ... }

```

Ao aplicar um condicional como o acima, o C# saberá o tipo da variável, então o compilador aceita algo assim:

```csharp
if (item is not FormatoPlanta) { throw ... }
var = item.Area ...

```

Com isso finalizamos mais um artigo sobre o C# 9.0. No próximo abordarei outros recursos desta nova versão da linguagem. Até lá!

- [ #C# 9.0 ](https://www.treinaweb.com.br/blog/tag/c-9-0)
- [ #Pattern Matching ](https://www.treinaweb.com.br/blog/tag/pattern-matching)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/11/C-SHARP-PROPRIEDADES-INIT-RECORD-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ C# 9.0 - Inteiros nativos e inferência de tipos ](https://www.treinaweb.com.br/blog/c-9-0-inteiros-nativos-e-inferencia-de-tipos) 

     Conheça os novos tipos de dados introduzidos no C# 9.0, os inteiros nativos e os novos recursos da inferência de tipos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/05/como-instalar-o-csharp-e-nosso-primeiro-exemplo-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     4 anos atrás

    ##  [ Estruturas condicionais e de repetição no C# ](https://www.treinaweb.com.br/blog/estruturas-condicionais-e-de-repeticao-no-csharp) 

     Veremos nesse artigo sobre quais são e como podemos utilizar as estruturas condicionais e as estruturas de repetição no C#

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/linguagens-paradigmas-400x280.jpg)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     10 anos atrás

    ##  [ Linguagens e paradigmas de programação ](https://www.treinaweb.com.br/blog/linguagens-e-paradigmas-de-programacao) 

     Saiba um pouco mais sobre as linguagens de programação e seus principais paradigmas.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/07/JULIA-1-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     6 anos atrás

    ##  [ O que é a Linguagem de Programação Julia? ](https://www.treinaweb.com.br/blog/o-que-e-a-linguagem-de-programacao-julia) 

     Veja neste artigo o que é a Linguagem de Programação Julia.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/23151556/MÓDULOS-NPM-400x280.png)  [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

     8 anos atrás

    ##  [ Criando módulos globais do NPM ](https://www.treinaweb.com.br/blog/criando-modulos-globais-do-npm) 

     Aprenda a fazer seus próprios módulos globais do NPM e crie ferramentas executadas diretamente do terminal em apenas 5 passos!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Entendendo ponteiros na Golang ](https://www.treinaweb.com.br/blog/entendendo-ponteiros-na-golang) 

     Neste artigo veremos sobre os ponteiros na Golang. Vamos entender o que são ponteiros, quais suas vantagens e desvantagens e como utilizá-los.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/algoritmos-400x280.jpg)  [ Algoritmos ](https://www.treinaweb.com.br/blog/categoria/algoritmos) 

     10 anos atrás

    ##  [ Conheça os principais algoritmos de ordenação ](https://www.treinaweb.com.br/blog/conheca-os-principais-algoritmos-de-ordenacao) 

     A ordenação de registros consiste em organizar os dados em ordem crescente ou decrescente. Veja os principais métodos de ordenação e a teoria por trás deles.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/10/o-que-e-e-como-comecar-com-golang-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Como instalar a Golang e executar nosso primeiro exemplo ](https://www.treinaweb.com.br/blog/como-instalar-a-golang-e-executar-nosso-primeiro-exemplo) 

     Neste artigo iremos aprender como instalar a Golang nos sistemas Windows, Linux e macOS e como executar nosso primeiro exemplo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/05/O-QUE-E-PHP-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     5 anos atrás

    ##  [ Guia da linguagem PHP ](https://www.treinaweb.com.br/blog/guia-da-linguagem-php) 

     Nesse guia de PHP você aprenderá o necessário para criar os seus primeiros softwares com a linguagem de programação PHP. Acesse agora mesmo!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/conhecendo-o-gerenciador-de-pacotes-homebrew-400x280.png)  [ Ferramentas ](https://www.treinaweb.com.br/blog/categoria/ferramentas) 

     6 anos atrás

    ##  [ Conhecendo o gerenciador de pacotes Homebrew ](https://www.treinaweb.com.br/blog/conhecendo-o-gerenciador-de-pacotes-homebrew) 

     Neste artigo conheceremos o Gerenciador de Pacotes Homebrew.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/lendo-dados-do-excel-via-dde-no-java-400x280.png)  [ Java ](https://www.treinaweb.com.br/blog/categoria/java) 

     6 anos atrás

    ##  [ Lendo dados do Excel via DDE no Java ](https://www.treinaweb.com.br/blog/lendo-dados-do-excel-via-dde-no-java) 

     Aprenda como ler dados do Excel via DDE no Java, utilizando a biblioteca JDDE da Pretty Tools.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/instalacao-do-vs-code-no-windows-linux-e-macos-400x280.png)  [ Ferramentas ](https://www.treinaweb.com.br/blog/categoria/ferramentas) 

     6 anos atrás

    ##  [ Instalação do VS Code no Windows, Linux e MacOS ](https://www.treinaweb.com.br/blog/instalacao-do-vs-code-no-windows-linux-e-macos) 

     Neste artigo veremos o que é o VS Code e como podemos realizar a sua instalação nos sistemas operacionais Windows, Linux e MacOS.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **13h 55min 42s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
