Visão Geral do CTS (Common Type System)

Esta seção descreve conceitos e define termos que ajudarão a compreender e trabalhar com a implementação do CTS da sua linguagem.

Classificação de Tipos

O CTS fornece suporte a duas categorias gerais de tipos, cada um delas é posteriormente dividida em subcategorias:

  • Tipos de valor

    Tipos de valor contêm seus dados diretamente, e instâncias de tipos de valor são alocadas na pilha ou alocadas embutidos em uma estrutura.Tipos de valor podem ser internos (implementados pelo tempo de execução), definidos pelo usuário, ou enumerações.Para obter uma lista de tipos de valor internos, consulte o .NET Framework Class Library.

  • Tipos de referência

    Tipos de referência armazenam uma referência para o endereço de memória do valor e são alocados no heap.Tipos referência podem ser tipos autodescritivos, tipos ponteiro ou tipos de interface.O tipo de um tipo de referência pode ser determinado a partir dos valores de tipos autodescritivos.Tipos autodescritivos são posteriormente divididos em matrizes e tipos de classe.Os tipos de classe são classes definidas pelo usuário, tipos de valor convertidos e delegates.

Variáveis que são tipos de valor possuem sua própria cópia dos dados e, portanto, operações em uma variável não afetam outras variáveis.Variáveis que são tipos de referência podem referenciar o mesmo objeto e, portanto, operações em uma variável podem afetar o mesmo objeto referenciado por outra variável.

Todos os tipos derivam do tipo base System.Object.

O exemplo a seguir mostra a diferença entre tipos de referência e tipos de valor.

Class Class1
    Public Value As Integer = 0
End Class 'Class1

Class Test
    
    Shared Sub Main()
        Dim val1 As Integer = 0
        Dim val2 As Integer = val1
        val2 = 123
        Dim ref1 As New Class1()
        Dim ref2 As Class1 = ref1
        ref2.Value = 123
        Console.WriteLine("Values: {0}, {1}", val1, val2)
        Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
    End Sub 'Main
End Class 'Test
using System;
class Class1
{
public int Value = 0;
}
class Test
{
    static void Main() {
        int val1 = 0;
        int val2 = val1;
        val2 = 123;
        Class1 ref1 = new Class1();
        Class1 ref2 = ref1;
        ref2.Value = 123;
        Console.WriteLine("Values: {0}, {1}", val1, val2);
        Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
    }
}

A saída do programa é a seguinte.

Values: 0, 123
Refs: 123, 123

O diagrama a seguir ilustra como esses tipos estão relacionados.Observe que instâncias de tipos podem ser simplesmente tipos de valor ou tipos autodescritivos, mesmo que haja subcategorias desses tipos.

Classificação de tipos

Para obter mais informações sobre cada tipo, consulte tipos de valor, enumerações, classes, delegates, matrizes, interfaces e ponteiros.

Valores e objetos

Valores são representações bina?ias de dados, e tipos fornecem uma maneira de interpretar esses dados.Um tipo de valor é armazenado diretamente como uma representação binária dos dados do tipo.O valor de um tipo de referência é o local da sequência de bits que representa os dados do tipo.

Cada valor possui um tipo exato que define por completo a representação do valor e as operações que são definidas no valor.Valores de tipos autodescritivos são chamados objetos.Enquanto é sempre possível determinar o tipo exato de um objeto examinando seu valor, não é possível fazer o mesmo com o um tipo de valor ou tipo ponteiro.Um valor pode ter mais de um tipo.Um valor cujo tipo implementa uma interface é também um valor do tipo da interface.Da mesma forma, um valor cujo tipo deriva de um tipo base é também um valor desse tipo base.

Tipos e Assemblys

O ambiente de execução usa assemblys para localizar e carregar tipos.O manifesto do assembly contém as informações que o ambiente de execução usa para resolver todas as referências de tipo feitas dentro do escopo do assembly.

Um nome de tipo em tempo de execução tem duas partes lógicas: o nome do assembly e o nome do tipo dentro do assembly.Dois tipos com o mesmo nome, mas em assemblys diferentes, são definidos como dois tipos distintos.

Assemblys fornecem consistência entre o escopo de nomes vistos pelo desenvolvedor e o escopo de nomes vistos pelo sistema em tempo de execução.Os desenvolvedores criam tipos no contexto de um assembly.O conteúdo do assembly que está sendo criando por um desenvolvedor estabelece o escopo de nomes que estará disponível em tempo de execução.

Tipos e Namespaces

No ponto de vista do ambiente de execução, um namespace é apenas um conjunto de nomes de tipo.Determinadas linguagens podem ter construções que ajudam os desenvolvedores a formar grupos lógicos de tipos, mas essas construções não são usadas pelo ambiente de execução ao vincular tipos.Assim, tanto o Objeto and Seqüência de caracteres classes são parte do Sistema namespace, mas o tempo de execução reconhece apenas os nomes completos de cada tipo, que são System.Object e System.String, respectivamente.

Você pode criar um único assembly que expõe os tipos que aparentam ter vindo de dois namespaces hierárquicos diferentes, como System.Collections e System.Windows.Forms.Você pode também construir dois assemblies que exportam tipos cujos nomes contenham MyDll.MyClass.

Se você criar uma ferramenta para representar tipos em um assembly como pertencentes a um namespace hierárquico, a ferramenta deve enumerar os tipos em um assembly, ou em um grupo de assemblys, e analisar os nomes dos tipos a fim de derivar um relacionamento hierárquico.

Consulte também

Conceitos

Visão geral sobre biblioteca classes do .NET Framework

CLS (Common Language Specification)

Outros recursos

Assemblies em Common Language Runtime

Common Type System

Common Language Runtime

Metadados e Componentes Autodescritivas

Interoperabilidade Entre Linguagens