0Pricing
C# Academy · Lección

Tipos de valor frente a tipos de referencia

Observe cómo se almacena y copia cada uno.

Tipos de valor frente a tipos de referencia es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Dos familias de tipos

Los tipos de C# se dividen en tipos de valor (int, double, bool, estructuras) y tipos de referencia (clases, cadenas y matrices). Se diferencian en cómo se almacenan y se copian.

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);
    }
}

Los tipos de valor contienen los datos

Una variable de tipo de valor contiene directamente sus datos. Normalmente, estos viven en la pila o insertos directamente dentro del objeto que los contiene.

using System;

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

Los tipos de referencia contienen una dirección

Una variable de tipo de referencia contiene una referencia —una dirección— a datos almacenados en el montón. La variable y el objeto son independientes.

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 copia: tipos de valor

Asignar un tipo de valor copia los datos. Cambiar la copia nunca afecta al 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 copia: tipos de referencia

Al asignar un tipo de referencia se copia la referencia, no el objeto. Después, ambas variables apuntan al mismo 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);
    }
}

Las estructuras son tipos de valor

Una struct definida por usted es un tipo de valor, por lo que se copia al asignarla, igual que 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);
    }
}

Paso a métodos

De forma predeterminada, los tipos de valor se pasan por copia y los tipos de referencia pasan una copia de la referencia. Por tanto, un método puede cambiar un objeto de una clase que el código llamador ve, pero no un int simple.

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);
    }
}

null y los tipos de referencia

Solo los tipos de referencia pueden ser null (es decir, la ausencia de un objeto). Los tipos de valor siempre contienen un valor, a menos que se declaren anulables con ?.

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));
    }
}

Diferencias en la igualdad

En los tipos de valor, == compara los datos. En los tipos de referencia, == normalmente compara la identidad (el mismo objeto), salvo que se haya 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 predeterminados

Los tipos de valor tienen un valor predeterminado similar a cero (0, false); los tipos de referencia tienen null como valor predeterminado.

using System;

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

Todo en conjunto

Saber si un tipo es de valor o de referencia permite predecir el comportamiento de las copias, la nulabilidad y la forma en que los métodos pueden modificarlo. Esto ayuda a escribir código correcto y sin errores.

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)");
    }
}

Comprobación rápida

Compruebe su comprensión de los tipos de valor y de referencia.

Resumen

Los tipos de valor (int, double, bool, estructuras) almacenan los datos directamente y se copian al asignarlos; los tipos de referencia (clases, cadenas, arrays) almacenan una referencia a un objeto del heap y copian la referencia. Solo los tipos de referencia admiten null de forma predeterminada, y el comportamiento de la asignación y la igualdad difiere entre ambas familias.

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);
    }
}

Preguntas frecuentes

¿La lección «Tipos de valor frente a tipos de referencia» es gratis?

Sí — el texto completo de «Tipos de valor frente a tipos de referencia» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Tipos de valor frente a tipos de referencia»?

Observe cómo se almacena y copia cada uno. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Tipos de valor frente a tipos de referencia»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Tipos de valor frente a tipos de referencia
  2. Boxing y unboxing
  3. Conversiones implícitas y explícitas
  4. La clase Convert y el análisis
← Volver a C# Academy