Sobes.tech
Junior

Qual é a diferença entre tipos de referência (Reference Type) e tipos de valor (Value Type) em C#?

sobes.tech IA

Resposta da IA

Os tipos de referência armazenam o endereço na memória onde os dados estão localizados. Os tipos de valor armazenam os próprios dados diretamente na variável.

Tipos de referência:

  • Herdam de System.Object.
  • São colocados no heap.
  • Ao atribuir uma variável de tipo referência a outra, copia-se a referência aos dados, não os dados em si.
  • Por padrão, são inicializados como null.
  • Incluem classes (class), interfaces (interface), delegados (delegate), arrays (array), strings (string).

Tipos de valor:

  • Herdam de System.ValueType (que por sua vez herda de System.Object).
  • São colocados na pilha (stack) ou dentro de um objeto se forem campos de um tipo referência.
  • Ao atribuir uma variável de tipo valor a outra, os dados em si são copiados.
  • Por padrão, são inicializados com o valor nulo (0 para números, false para bool, valor vazio para struct).
  • Incluem estruturas (struct), enumerações (enum), tipos de dados integrados (int, float, bool, etc.).

Exemplo:

// Tipo de referência
public class MyClass
{
    public int Value;
}

// Tipo de valor
public struct MyStruct
{
    public int Value;
}

// Uso
MyClass obj1 = new MyClass { Value = 10 };
MyClass obj2 = obj1; // obj2 e obj1 referenciam o mesmo objeto no heap
obj2.Value = 20; // Alterar através de obj2 afeta obj1
Console.WriteLine(obj1.Value); // Vai mostrar 20

MyStruct s1 = new MyStruct { Value = 10 };
MyStruct s2 = s1; // Os dados são copiados, s2 é uma cópia independente
s2.Value = 20; // Alterar através de s2 não afeta s1
Console.WriteLine(s1.Value); // Vai mostrar 10