Resumo : neste tutorial, você aprenderá sobre a conversão de C#, incluindo upcasting e downcasting.
Introdução à conversão de C#
C# é uma linguagem de programação de tipo estático. Isso significa que depois de declarar uma variável , você não poderá redeclará-la. Além disso, você não pode reatribuir um valor de outro tipo à variável, a menos que esse tipo seja implicitamente compatível com o tipo da variável.
Uma referência de objeto pode ser:
- Upcast implicitamente para uma referência de classe base. Um upcast sempre dá certo.
- Downcast explicitamente para uma referência de subclasse. Um downcast só terá sucesso se os objetos forem de tipos compatíveis.
Upcasting
Um upcast cria uma referência de classe base a partir de uma referência de subclasse. Por exemplo:
class Person
{
public string Name { get; set; }
}
class Employee: Person
{
public string JobTitle { get; set; }
}
Linguagem de código: C# ( cs )
var employee = new Employee()
{
Name = "John Doe",
JobTitle = "C# Developer"
};
Person person = employee;
Linguagem de código: C# ( cs )
Neste exemplo:
- Primeiro, defina a
Employee
classe que herda daPerson
classe. APerson
classe é uma classe base e aEmployee
classe é uma subclasse. - Segundo, crie uma nova instância da
Employee
classe e atribua-a àemployee
variável. - Terceiro, atribua o objeto referenciado pela
employee
variável a uma referência daPerson
classe.
Após o upcasting, a variável person
ainda faz referência ao mesmo Employee
objeto. Ambas employee
as person
variáveis e fazem referência ao mesmo Employee
objeto. O objeto em si não muda.
Embora as variáveis person
e employee
se refiram ao mesmo objeto, person
tem uma visão mais restritiva sobre esse objeto. Por exemplo, ele só pode acessar a Name
propriedade, mas não pode acessar a JobTitle
propriedade do objeto.
A instrução a seguir causará um erro em tempo de compilação:
person.JobTitle;
Linguagem de código: C# ( cs )
Erro:
'Person' does not contain a definition for 'JobTitle'...
Linguagem de código: texto simples ( texto simples )
Downcasting
Uma operação downcast cria uma referência de subclasse a partir de uma referência de classe base. Um downcast requer uma expressão de conversão com a seguinte sintaxe:
(T)E
Linguagem de código: C# ( cs )
A expressão cast converte explicitamente o resultado da expressão ( E
) no tipo T
. Se não existir nenhuma conversão explícita do tipo E
para type T
, o compilador gerará um erro.
Além disso, em tempo de execução, a conversão explícita poderá falhar e a expressão de conversão poderá lançar uma exceção.
O exemplo a seguir ilustra o downcasting:
var employee = new Employee()
{
Name = "John Doe",
JobTitle = "C# Developer"
};
Person person = employee; // upcast
Employee employee2 = (Employee)person; // downcast
Console.WriteLine(employee2.Name);
Console.WriteLine(employee2.JobTitle);
Linguagem de código: C# ( cs )
Neste exemplo, a operação downcast converte explicitamente o objeto referenciado pela person
referência no arquivo employee2
.
Como a employee2
variável se refere ao Employee
objeto, ela pode acessar todas as propriedades do Employee
objeto ‘.
O seguinte define a Candidate
classe que herda da Person
classe:
class Person
{
public string Name { get; set; }
}
class Employee : Person
{
public string JobTitle { get; set; }
}
class Candidate : Person
{
}
Linguagem de código: C# ( cs )
O seguinte downcast falhará em tempo de execução:
var employee = new Employee()
{
Name = "John Doe",
JobTitle = "C# Developer"
};
Person person = employee; // upcast
Candidate candidate = (Candidate)person; // downcast fail at runtime
Linguagem de código: C# ( cs )
Neste exemplo, a person
variável faz referência a uma instância da Employee
classe. No entanto, nós o lançamos como uma instância da Candidate
classe, que não é uma instância da Employee
classe.
Se você executar o programa, obterá a seguinte exceção:
System.InvalidCastException: 'Unable to cast object of type 'Employee' to type 'Candidate'.'
Linguagem de código: texto simples ( texto simples )
O operador como
Se um downcast falhar, lançará uma exceção em tempo de execução. Se você não quiser esse comportamento, poderá usar o as
operador.
O as
operador executa um downcast que avalia null
em vez de lançar uma exceção se o downcast falhar. Isso permite verificar posteriormente se o resultado do downcast é nulo ou não. Por exemplo:
var employee = new Employee()
{
Name = "John Doe",
JobTitle = "C# Developer"
};
Person person = employee;// upcast
Candidate candidate = person as Candidate;
if (candidate != null)
{
Console.WriteLine(candidate.Name);
}
Linguagem de código: C# ( cs )
Neste exemplo, o downcast falha. Portanto, a candidate
variável é nula. Em seguida, verificamos se candidate
é nulo ou não antes de exibir sua name
propriedade no console.
Resumo
- Uma referência de objeto pode ser implicitamente upcast para uma referência de classe base. Um upcast sempre dá certo.
- Uma referência de objeto também pode ser explicitamente reduzida para uma referência de subclasse. Um downcast será bem-sucedido somente se o objeto for de tipo compatível.
- Use o
as
operador para executar um downcast que avalianull
em vez de lançar uma exceção.