terça-feira, 27 de fevereiro de 2007

Conhecendo C# - Tipos - Parte 2

Conhecendo C# - Tipos - Parte 2 (Valor e Tipos Referência)

Os tipos de dados no C# são divididos em 3 categorias:
  • Tipos valor(value types), que são alocadas na pilha;
  • Tipos referência(reference types), que são alocados na heap(Managed Heap);
  • Tipos ponteiro(pointer types), que são ponteiros que poderão ser utilizados em código “inseguro”(unsafe).

Tipos valor armazenam dados em memória enquanto tipos referência armazenam uma referência, ou o endereço, para o valor atual. No entanto tipos referência não possuem tratamento especial, com relação a operadores, assim como um ponteiro em C++. A figura 1 exibe a alocação de memória dos tipos mais usuais em C#, tipos valor e tipos referência.


Figura 1: Tipo Valor e Tipo Referência

Quando utilizamos uma variável do tipo referência não estaremos acessando seu valor diretamente, mas sim um endereço referente ao seu valor, ao contrário do tipo valor que permite o acesso diretamente a seu conteúdo. Diante disso, devemos considerar que a manipulação de variáveis do tipo valor oferece uma performance superior a variável do tipo referência, por não possuir a necessidade de alocação em heap(área de alocação dinâmica) e não ser acessada através de um ponteiro. Normalmente um processo de alocação em heap poderá forçar a coleta de lixo(garbage collection), para liberação de memória cosumida. Portanto, utilizar variáveis do tipo valor, nos casos que abordaremos mais adiante, é a chave para obter uma performance superior na aplicação.

O código abaixo ilustra a declaração dos tipos previamente discutidos:

//Tipo valor
int x = 10;

//Tipo referência
int y = new int(10);

No C# os tipos de dados da CLR(.NET Types) também poderão ser utilizados, o código abaixo não possui nenhuma diferença do código anterior, exceto sintática:

//Tipo valor
System.Int32 x = 10;

//Tipo referência
System.Int32 y = new System.Int32(10)

Podem ser variáveis do tipo valor: bool, byte, char, decimal, double, enum, float, int, long, sbyte, short, struct, uint, ulong e ushort. Divididas em duas categorias estrutura(struct) e enumeração(enum). A struct está classificada em estruturas definidas pelo usuário ou estruturas simples(built-in). Considerar os principais casos para o uso de variáveis do tipo valor, quando:

  • A variável deve atuar como tipo primitivo;
  • A variável não necessita herdar de qualquer outro tipo;
  • A variável não necessita ser derivada por outro tipo;
  • A variável não será passada freqüentemente como parâmetro entre métodos. Isso evitará cópia em mémoria entre as chamadas, que geralmente penalizam a performance.

Ou seja, basicamente quando não há a necessidade de manipular um objeto. Para todos os outros casos aplicam-se a variáveis do tipo referência: class, delegate, interface, object e string. O que deve ser observado no .NET Framework é que uma string não é tratada como tipo referência, por ser herdada diretamente de System.Object, diferentemente de variáveis do tipo valor que são herdados de System.ValueTypes.

Se for fornecido nenhum contéudo para essas variáveis, por padrão, as do tipo valor inicializam com 0, enquanto as do tipo referência possuem ponteiro nulo(null). O acesso a uma variável não inicializada do tipo referência gera uma excessão do tipo NullReferenceException.

Ir para o índice do
Manual.
Próximo artigo: .

Um comentário:

!SirOver! disse...

Prezado,
Agradeço o artigo, está de parabéns. Algumas dúvidas:
String então é considerado uma classe, assim como em JAVA ?
Struct e enum não são estruturas definidas pelo usuário?
Pelo que entendi do artigo, estas seriam parte da definição do que é tipo primitivo?
Você pode explicar melhor o que seria Struct e Enum ?

Obrigado pela Atennção!

Neobux