Skip to main content

Is | C#

  • Is | C#

No C#, o operador is é usado para realizar verificações de tipos, além de realizar o pattern matching, que é uma técnica poderosa para verificar e extrair informações de objetos de forma mais legível e concisa. Abaixo, listo as principais sintaxes e usos do operador is no C#.

1. Verificação de Tipo Simples (Antes do C# 7.0)

O uso clássico do is é para verificar se um objeto é de um tipo específico. Isso retorna true se o objeto for do tipo especificado ou um subtipo dele.

Sintaxe:

if (obj is TipoEsperado)
{
// O objeto é do tipo TipoEsperado
}

Exemplo:

object obj = "Olá Mundo!";
if (obj is string)
{
Console.WriteLine("É uma string!");
}

2. Verificação de Tipo com Atribuição (Pattern Matching - C# 7.0 em diante)

A partir do C# 7.0, você pode usar o operador is para verificar o tipo de um objeto e, ao mesmo tempo, fazer a desconstrução e atribuição de uma variável, se o tipo for compatível.

Sintaxe:

if (obj is TipoEsperado var)
{
// Aqui, 'var' será automaticamente convertido para TipoEsperado
// Você pode usar 'var' dentro do bloco
}

Exemplo:

object obj = "Olá Mundo!";
if (obj is string str)
{
Console.WriteLine($"A string é: {str}");
}

3. Pattern Matching com is e Padrões (C# 9.0 em diante)

A partir do C# 9.0, o is pode ser combinado com padrões para fazer verificações mais complexas.

Verificação de valores em coleções ou objetos

Você pode verificar se um objeto é de um tipo específico e, ao mesmo tempo, verificar se ele satisfaz uma condição.

Sintaxe:

if (obj is TipoEsperado { Propriedade: valorEsperado })
{
// O objeto é do tipo TipoEsperado e possui a propriedade com o valorEsperado
}

Exemplo:

public class Pessoa
{
public string Nome { get; set; }
public int Idade { get; set; }
}

object obj = new Pessoa { Nome = "Maria", Idade = 25 };

if (obj is Pessoa { Idade: 25 } pessoa)
{
Console.WriteLine($"Pessoa encontrada: {pessoa.Nome}, Idade: {pessoa.Idade}");
}

4. is not (C# 9.0 em diante)

O operador is not foi introduzido no C# 9.0. Ele é utilizado para verificar se um objeto não é de um determinado tipo ou não corresponde a um padrão específico.

Sintaxe:

if (obj is not TipoEsperado)
{
// O objeto não é do tipo TipoEsperado
}

Exemplo:

object obj = 42;
if (obj is not string)
{
Console.WriteLine("Não é uma string!");
}

5. Pattern Matching para Tipos Nullable (C# 7.0 em diante)

Em tipos nullable (como int? ou double?), você pode verificar se o valor é não nulo e fazer a atribuição ao mesmo tempo.

Sintaxe:

int? numero = 5;
if (numero is int valor)
{
Console.WriteLine($"O número é: {valor}");
}

6. Verificação de Tipo com is em Tipos Genéricos

Se você estiver lidando com tipos genéricos, o is pode ser útil para verificar o tipo do argumento genérico.

Exemplo:

public class ExemploGenerico<T>
{
public void VerificarTipo(object obj)
{
if (obj is T)
{
Console.WriteLine($"O objeto é do tipo {typeof(T)}");
}
else
{
Console.WriteLine("Tipo não correspondente");
}
}
}

var exemplo = new ExemploGenerico<int>();
exemplo.VerificarTipo(10); // O objeto é do tipo System.Int32
exemplo.VerificarTipo("Texto"); // Tipo não correspondente

7. Verificação de Tipos com is para Tipos de Valor (Value Types)

O is também pode ser utilizado para verificar tipos de valor, como tipos primitivos (int, double, etc.) ou structs.

Exemplo:

object valor = 10;
if (valor is int)
{
Console.WriteLine("É um valor inteiro!");
}

Resumo das Sintaxes:

  • Verificação simples de tipo:

    if (obj is TipoEsperado)
  • Verificação de tipo com atribuição:

    if (obj is TipoEsperado var)
  • Verificação com padrões:

    if (obj is TipoEsperado { Propriedade: valorEsperado })
  • Verificação de tipo com is not:

    if (obj is not TipoEsperado)
    if (query.ObterFechamentoMensalDesatualizado() is not { } fechamentoMensalDesatualizado)