0Pricing
C# Academy · Aula

Tipos de valor versus tipos de referência

Veja como cada um é armazenado e copiado.

Tipos de valor versus tipos de referência é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

Duas famílias de tipos

Os tipos do C# se dividem em tipos de valor (int, double, valores booleanos e estruturas) e tipos de referência (classes, textos e matrizes). Eles diferem na forma como são armazenados e copiados.

using System;

class Program
{
    static void Main()
    {
        int valueType = 5;          // value type
        int[] referenceType = { 1, 2, 3 };  // reference type
        Console.WriteLine(valueType + ", length " + referenceType.Length);
    }
}

Tipos de valor contêm os dados

Uma variável de tipo de valor contém diretamente seus dados. Normalmente, esses dados ficam na pilha ou incorporados ao objeto que os contém.

using System;

class Program
{
    static void Main()
    {
        int a = 10;
        double b = 3.14;
        bool c = true;
        Console.WriteLine(a + ", " + b + ", " + c);
    }
}

Tipos de referência contêm um endereço

Uma variável de tipo de referência contém uma referência (um endereço) para dados armazenados na memória dinâmica. A variável e o objeto são entidades separadas.

using System;

class Box { public int Value; }

class Program
{
    static void Main()
    {
        Box b = new Box();   // b refers to a heap object
        b.Value = 42;
        Console.WriteLine(b.Value);
    }
}

Semântica de cópia: tipos de valor

Atribuir um tipo de valor copia os dados. Alterar a cópia nunca afeta o original.

using System;

class Program
{
    static void Main()
    {
        int a = 1;
        int b = a;   // copy
        b = 99;
        Console.WriteLine("a=" + a + ", b=" + b);
    }
}

Semântica de cópia: tipos de referência

Atribuir um tipo de referência copia a referência, não o objeto. Depois disso, ambas as variáveis apontam para o mesmo objeto.

using System;

class Box { public int Value; }

class Program
{
    static void Main()
    {
        Box a = new Box { Value = 1 };
        Box b = a;   // same object
        b.Value = 99;
        Console.WriteLine("a.Value=" + a.Value + ", b.Value=" + b.Value);
    }
}

Estruturas são tipos de valor

Um struct definido por você é um tipo de valor, portanto é copiado na atribuição, assim como int.

using System;

struct Point { public int X, Y; }

class Program
{
    static void Main()
    {
        Point p1 = new Point { X = 1, Y = 2 };
        Point p2 = p1;   // full copy
        p2.X = 99;
        Console.WriteLine("p1.X=" + p1.X + ", p2.X=" + p2.X);
    }
}

Passando para métodos

Por padrão, os tipos de valor são passados por cópia, e os tipos de referência passam uma cópia da referência. Assim, um método pode alterar um objeto de classe que o chamador vê, mas não um int simples.

using System;

class Counter { public int N; }

class Program
{
    static void BumpInt(int x) { x++; }
    static void BumpObj(Counter c) { c.N++; }

    static void Main()
    {
        int i = 0;
        BumpInt(i);
        var c = new Counter();
        BumpObj(c);
        Console.WriteLine("i=" + i + ", c.N=" + c.N);
    }
}

nulo e tipos de referência

Somente os tipos de referência podem ser null (a ausência de um objeto). Os tipos de valor sempre contêm um valor, a menos que sejam declarados como anuláveis com ?.

using System;

class Program
{
    static void Main()
    {
        string text = null;        // reference type can be null
        int? maybe = null;          // nullable value type
        Console.WriteLine((text == null) + ", " + (maybe == null));
    }
}

Diferenças de igualdade

Para tipos de valor, == compara os dados. Para tipos de referência, == geralmente compara a identidade (o mesmo objeto), a menos que seja sobrescrito.

using System;

class Program
{
    static void Main()
    {
        int a = 5, b = 5;
        Console.WriteLine("ints: " + (a == b));   // True - same value

        object o1 = new object();
        object o2 = new object();
        Console.WriteLine("objects: " + (o1 == o2));   // False - different identity
    }
}

Valores padrão

Os tipos de valor têm um valor padrão semelhante a zero (0, falso); os tipos de referência têm null como padrão.

using System;

class Program
{
    static void Main()
    {
        int defaultInt = default;
        bool defaultBool = default;
        string defaultString = default;
        Console.WriteLine(defaultInt + ", " + defaultBool + ", null? " + (defaultString == null));
    }
}

Colocando tudo em conjunto

Saber se um tipo é de valor ou de referência permite prever o comportamento de cópia, a anulabilidade e como os métodos podem alterá-lo. Isso contribui para escrever código correto e sem erros.

using System;

struct Money { public decimal Amount; }
class Wallet { public decimal Amount; }

class Program
{
    static void Main()
    {
        Money m1 = new Money { Amount = 10 };
        Money m2 = m1; m2.Amount = 99;

        Wallet w1 = new Wallet { Amount = 10 };
        Wallet w2 = w1; w2.Amount = 99;

        Console.WriteLine("Money copy: " + m1.Amount + " (independent)");
        Console.WriteLine("Wallet ref: " + w1.Amount + " (shared)");
    }
}

Verificação rápida

Teste sua compreensão sobre tipos de valor e de referência.

Recapitulação

Tipos de valor (int, duplo, booleano, estruturas) armazenam os dados diretamente e são copiados na atribuição; tipos de referência (classes, cadeias de caracteres, vetores) armazenam uma referência para um objeto na memória dinâmica e copiam a referência. Por padrão, somente os tipos de referência são anuláveis, e o comportamento da atribuição e a igualdade diferem entre essas duas famílias.

using System;

struct V { public int N; }
class R { public int N; }

class Program
{
    static void Main()
    {
        V v1 = new V { N = 1 }; V v2 = v1; v2.N = 9;
        R r1 = new R { N = 1 }; R r2 = r1; r2.N = 9;
        Console.WriteLine(v1.N + " vs " + r1.N);
    }
}

Perguntas Frequentes

A aula “Tipos de valor versus tipos de referência” é grátis?

Sim — o texto completo de “Tipos de valor versus tipos de referência” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Tipos de valor versus tipos de referência”?

Veja como cada um é armazenado e copiado. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Tipos de valor versus tipos de referência”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Tipos de valor versus tipos de referência
  2. Boxing e unboxing
  3. Conversões implícitas e explícitas
  4. A classe Convert e análise
← Voltar para C# Academy