Fundição C#

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 Employeeclasse que herda da Personclasse. A Personclasse é uma classe base e a Employeeclasse é uma subclasse.
  • Segundo, crie uma nova instância da Employeeclasse e atribua-a à employeevariável.
  • Terceiro, atribua o objeto referenciado pela employeevariável a uma referência da Personclasse.

Após o upcasting, a variável personainda faz referência ao mesmo Employeeobjeto. Ambas employeeas personvariáveis ​​​​e fazem referência ao mesmo Employeeobjeto. O objeto em si não muda.

Embora as variáveis person​​e employeese refiram ao mesmo objeto, persontem uma visão mais restritiva sobre esse objeto. Por exemplo, ele só pode acessar a Namepropriedade, mas não pode acessar a JobTitlepropriedade 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)ELinguagem 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 Epara 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 personreferência no arquivo employee2.

Como a employee2variável se refere ao Employeeobjeto, ela pode acessar todas as propriedades do Employeeobjeto ‘.

O seguinte define a Candidateclasse que herda da Personclasse:

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 runtimeLinguagem de código:  C#  ( cs )

Neste exemplo, a personvariável faz referência a uma instância da Employeeclasse. No entanto, nós o lançamos como uma instância da Candidateclasse, que não é uma instância da Employeeclasse.

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 asoperador.

O asoperador executa um downcast que avalia nullem 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 candidatevariável é nula. Em seguida, verificamos se candidateé nulo ou não antes de exibir sua namepropriedade 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 asoperador para executar um downcast que avalia nullem vez de lançar uma exceção.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *