Hoje vamos comparar os operadores is e as usados na linguagem C#. |
Segundo a Microsoft :
O operador is verifica se o resultado de uma expressão é compatível com um tipo fornecido ou (a partir do C# 7.0) testa uma expressão em relação a um padrão.
O operador as converte explicitamente o resultado de uma expressão para uma determinada referência ou tipo de valor anulável. Se a conversão não for possível, o operador as retorna null e não lança uma exceção.
Vejamos a seguir algumas das principais diferenças entre esses operadores:
Operador is | Operador as |
È usado para verificar se o tipo de tempo de execução de um objeto é compatível com o tipo especificado ou não | È usado para executar a conversão entre tipos de referência compatíveis ou tipos anuláveis. |
É do tipo booleano | Não é do tipo booleano |
Retorna true se o objeto especificado é do mesmo tipo | Retorna o objeto quando eles são compatíveis com o tipo especificado. |
Retorna false se o objeto especificado não for do mesmo tipo | Retorna null se a conversão não for possível. |
É usado apenas para conversões de referência, boxe e unboxing | É usado apenas para conversões anuláveis, de referência e boxing |
Uso:
bool isobject = (Object is Type);
|
Uso:
Type obj = Object as Type;
|
A seguir vejamos um exemplo prático de uso de cada um destes operadores.
recursos usados:
Criando o projeto C# no VS 2019
Crie um projeto Console do tipo .NET Core chamado CShp_IsAs;
Inclua o código a seguir no arquivo Programcs a definição das classes Aluno e Funcionario:
Obs: Usamos o namespace: using static System.Console;
class Aluno
{
public string Nome { get; set; }
public int Idade { get; set; }
}
class Funcionario
{
public string Nome { get; set; }
public int Idade { get; set; }
public double Salario { get; set; }
}
|
A seguir na classe Program vamos incluir o código abaixo no método Main():
static void Main(string[] args)
{
UsandoOperadorIs();
UsandoOperadorAs();
ReadLine();
}
|
A seguir temos o código que mostra o uso do operador is no método UsandoOperadorIs():
private static void UsandoOperadorIs() { Aluno aluno1 = new Aluno(); aluno1.Nome = "Amanda"; aluno1.Idade = 15; Funcionario funcionario1 = new Funcionario();
funcionario1.Nome = "Macoratti";
funcionario1.Salario = 5000;
funcionario1.Idade = 25;
// Verifica se funcionario é do tipo Aluno
bool isAluno = funcionario1 is Aluno;
WriteLine($"funcionario1 é um Aluno ?: {isAluno.ToString()}");
// Verifica se aluno é do tipo Aluno
isAluno = (aluno1 is Aluno);
WriteLine($"aluno1 é um Aluno ?: {isAluno.ToString()}");
aluno1 = null;
// Verifica o objeto tipo Null
isAluno = (aluno1 is Aluno);
WriteLine($"aluno1(null) é um Aluno ?: {isAluno.ToString()}");
}
|
O resultado obtido é visto abaixo:
A seguir temos o código que mostra o uso do operador as no método UsandoOperadorAs():
private static void UsandoOperadorAs() { Aluno aluno1 = new Aluno(); aluno1.Nome = "Amanda"; aluno1.Idade = 15; Funcionario funcionario1 = new Funcionario();
funcionario1.Nome = "Macoratti";
funcionario1.Salario = 5000;
funcionario1.Idade = 25;
WriteLine($"funcionario1 é um Aluno ?: {VerificaEConverte(funcionario1)}");
WriteLine($"aluno1 é um Aluno ?: {VerificaEConverte(aluno1)}");
}
|
Aqui precisamos criar o método VerificaEConverte() para usar o operador as:
public static string VerificaEConverte(dynamic obj)
{
// Se obj é do tipo Aluno ele atribui um valor para alunobj
// caso contrário atribui null
Aluno alunobj = obj as Aluno;
if (alunobj != null)
return "O objeto é um Aluno e seu nome é " + alunobj.Nome;
return "Não é um Aluno";
}
|
O resultado obtido é visto abaixo:
As vantagens em usar as ao invés de is
No caso d operador is, para realizar um cast para Tipo, precisamos
executar duas etapas:
Isso afeta o desempenho, pois cada vez que a CLR passa pela hierarquia de herança, verificando cada tipo base com o tipo especificado.
Usando o operador as isso será feito em uma única etapa.
Assim usamos o
operador is somente para verificar o tipo.
Pegue o código do
projeto aqui:
CShp_IsAs.zip
"Se o mundo vos
odeia, sabei que, primeiro do que a vós, me odiou a mim.
Se vós fôsseis do mundo, o mundo amaria o que era seu, mas porque não sois do
mundo, antes eu vos escolhi do mundo, por isso é que o mundo vos odeia."
João 15:18,19
Referências:
VB .NET - Lendo Arquivos Binários - BinaryReader - Macoratti ...
Tratamento de arquivos - Questões práticas - Macoratti.net
C# - Copiando Arquivos - Macoratti
C# - Localizando linhas em um arquivo texto - Macoratti.net
VB .NET - Armazenando um objeto serializado em um arquivo
C# - Programa para Loja de Instrumentos Musicais - Macoratti ...
C# - Lendo e gravando dados binários no SQL ... - Macoratti