Sistema de Tipos Unificado

Em C# todo tipo pode ser visto como um objeto. Isto quer dizer basicamente o seguinte:

  • Qualquer expressão, de qualquer tipo, pode ser atribuída a uma variável do tipo object;
  • Qualquer expressão, de qualquer tipo, tem propriedades e métodos;

Os tipos “por referência”, pela própria natureza, são referências (“ponteiros domesticados”) e não implicam em um custo a mais ao terem propriedades e métodos. Já os tipos por valor, em princípio, não carregam nenhum custo adicional. Eles são automaticamente convertidos para referências quando necessário em um processo conhecido como “boxing” que será explicado adiante.

Como já foi comentado, o tipo base que promove toda a unicidade deste sistema de tipos é o Object. Relembrando, todos os tipos criados herdam implicitamente de object e podem ser representados por ele, ou seja, object pode receber qualquer outro tipo, inclusive primitivos (por valor).

Object (por referência)

O tipo de object é um alias para Object no .NET Framework. No sistema de tipo unificado do C#, Todos os tipos, pré-definidos e definidos pelo usuário, tipos de referência e tipos de valor, herdam direta ou indiretamente da Object. Você pode atribuir valores de qualquer tipo a variáveis de tipo object. Quando uma variável de um tipo valor é convertido em objeto, é um processo chamado de Boxed. Quando uma variável do tipo object é convertida em um tipo de valor, é um processo chamado unboxed. Ambos serão explicados adiante.

O exemplo a seguir mostra como variáveis do tipo object podem aceitar valores de qualquer tipo de dados e como variáveis do tipo object podem usar métodos em Object do .NET Framework.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class ObjectTest
{
   public int i = 10;
}
 
class MainClass2
{
   static void Main()
   {
      object a;
      a = 1;   // exemplo de boxing
      Console.WriteLine(a);
      Console.WriteLine(a.GetType());
      Console.WriteLine(a.ToString());
 
      a = new ObjectTest();
      ObjectTest classRef;
      classRef = (ObjectTest)a;
      Console.WriteLine(classRef.i);
   }
}
/* saída no console
    1
    System.Int32
    1
 * 10
*/