Código Central – Blog
Aprenda C#

Tipos em C#: Entendendo Referências e Valores

Ilustração representando as diferenças entre tipos de referência e tipos de valor em C#, mostrando como os tipos de valor armazenam dados diretamente e os tipos de referência armazenam referências para objetos, com destaque para conceitos como boxing, unboxing e tipos dinâmicos.

Em C#, os tipos são divididos em duas categorias principais: tipos de referência e tipos de valor. Cada uma dessas categorias tem características que afetam o comportamento das variáveis e como os dados são armazenados e manipulados na memória. Vamos explorar em detalhes as diferenças entre esses tipos e como eles são usados.

Tipos de Referência e Tipos de Valor

A principal diferença entre tipos de referência e tipos de valor é como a memória é manipulada:

Exemplo:

int valor = 10; // Tipo de valor: armazena o dado diretamente
string texto = "Olá"; // Tipo de referência: armazena uma referência ao objeto string

Tipos de Referência

Os tipos de referência incluem classes, interfaces, arrays, delegates e o tipo especial dynamic. Esses tipos permitem que múltiplas variáveis referenciem o mesmo objeto, o que significa que alterações feitas através de uma variável podem ser refletidas em outras variáveis que apontam para o mesmo objeto.

Exemplo:

string a = "Hello";
string b = a; // Ambas as variáveis referenciam o mesmo objeto
b = "World";
Console.WriteLine(a); // Saída: "Hello"

Tipos de Classe

Uma classe define uma estrutura de dados que pode conter membros de dados e membros de função, além de suportar herança. Classes podem ser usadas para criar instâncias (objetos), que são alocadas na memória heap.

class Pessoa
{
    public string Nome { get; set; }
    public int Idade { get; set; }
}

Pessoa p = new Pessoa { Nome = "João", Idade = 30 };

O Tipo object

Em C#, todos os tipos derivam de System.Object, tornando-o a classe base de todos os tipos. Isso significa que qualquer tipo pode ser tratado como um object.

object obj = 42;
Console.WriteLine(obj.GetType()); // Saída: System.Int32

O Tipo dynamic

O tipo dynamic permite que você manipule objetos sem a verificação estática em tempo de compilação. As verificações de tipo são realizadas apenas em tempo de execução.

dynamic d = 10;
d = "Agora sou uma string!";
Console.WriteLine(d); // Saída: Agora sou uma string!

Tipos de Valor

Os tipos de valor incluem estruturas (struct), enums e tipos primitivos, como int, float, e bool. Esses tipos armazenam os dados diretamente na memória stack, o que significa que cada variável tem sua própria cópia dos dados.

Exemplo:

int x = 10;
int y = x; // y recebe uma cópia de x
y = 20;
Console.WriteLine(x); // Saída: 10 (x não foi alterado)

Boxing e Unboxing

Os tipos de valor podem ser convertidos em tipos de referência através de um processo chamado boxing, e o processo inverso é chamado de unboxing.

int x = 10;
object obj = x; // Boxing: o valor é envolvido como um object
int y = (int)obj; // Unboxing: o object é convertido de volta para int

Tipos Genéricos

Tanto tipos de valor quanto tipos de referência podem ser usados como parâmetros de tipos genéricos. Isso permite criar classes e métodos reutilizáveis que funcionam com qualquer tipo.

List<int> listaDeInteiros = new List<int>();
List<string> listaDeStrings = new List<string>();

Conclusão

Os tipos de referência e valor em C# têm características distintas que influenciam a forma como os dados são manipulados na memória. Compreender essas diferenças é essencial para escrever código eficiente e seguro em C#. Além disso, o uso de tipos genéricos, boxing/unboxing e o tipo dynamic proporciona flexibilidade adicional ao lidar com diferentes cenários no desenvolvimento de software.

Posts relacionados

Diretivas de Pré-processamento no C#: Como e Quando Utilizá-las

Diogo
2 semanas atrás

Termos e Definições Essenciais no Desenvolvimento com C#

Diogo
2 semanas atrás

Assinaturas e Sobrecarga em C#

Diogo
1 semana atrás
Sair da versão mobile