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)