Lección 6 · ~14 min · ← Lección 5

Clases y objetos: datos con comportamiento

Una clase es un plano; un objeto es algo construido a partir de él. Las variables de tipo clase guardan una referencia a ese algo. Tres ideas: los campos guardan los datos, los constructores los preparan, los métodos actúan sobre ellos.

Una clase con todo encima

class CuentaBancaria
{
    public string Titular;                 // campo: cada objeto tiene el suyo

    public CuentaBancaria(string titular)  // constructor: corre al hacer 'new'
    {
        Titular = titular;
    }

    public void Imprimir()
    {
        Console.WriteLine(Titular);
    }
}

CuentaBancaria cuenta = new CuentaBancaria("Ada");   // constrúyela
cuenta.Imprimir();

Pieza a pieza: public = visible desde fuera de la clase. El constructor se llama igual que la clase y no tiene tipo de retorno — su trabajo es que el objeto sea válido en el instante en que existe. new reserva memoria y lo ejecuta.

Cada objeto es el suyo

class Perro
{
    public string Nombre;

    public Perro(string nombre) { Nombre = nombre; }
}

Perro a = new Perro("Ada");
Perro b = new Perro("Grace");
Console.WriteLine(a.Nombre);
Console.WriteLine(b.Nombre);        // dos objetos, dos Nombre — sin compartir

static: pertenece a la CLASE, no a un objeto

class Contador
{
    public static int Total = 0;      // UNA copia, compartida por todo

    public static void Incrementar()
    {
        Total++;
    }
}

Contador.Incrementar();                 // se llama sobre la clase — sin objeto
Contador.Incrementar();
Contador.Incrementar();
Console.WriteLine(Contador.Total);

Ya usas miembros static constantemente: Console.WriteLine, int.Parse, Math.Max — todos métodos sobre una clase, sin objeto de por medio. Regla práctica: static para utilidades y contadores compartidos, instancia para "cada uno tiene el suyo".

Propiedades: campos con cara pública

El estilo moderno de C# — las propiedades automáticas se parecen a campos pero son miembros con get/set:

class Rectangulo
{
    public double Ancho { get; set; }     // propiedad automática
    public double Alto { get; set; }

    public double Area()
    {
        return Ancho * Alto;              // no hace falta escribir 'this.' — va implícito
    }
}

Rectangulo r = new Rectangulo { Ancho = 3, Alto = 4 };   // inicializador de objeto
Console.WriteLine(r.Area());

El inicializador de objeto (new Rectangulo { … }) asigna propiedades justo después de construir — no hace falta un constructor con parámetros para la configuración simple.

this: cuando los nombres chocan

Dentro del código de instancia, this es "el objeto actual". Su trabajo principal: desambiguar un parámetro de un campo con el mismo nombre:

class Perro
{
    private string nombre;

    public Perro(string nombre)
    {
        this.nombre = nombre;   // this.nombre = el campo; nombre = el parámetro
    }
}

Consejo de estilo: nombrar los campos en PascalCase (Nombre) o con prefijo (_nombre) hace que this. casi nunca sea necesario — elige una convención por base de código.

Cuando los constructores van mal

En cuanto declaras CUALQUIER constructor, C# deja de proporcionar el vacío gratis — y new Persona() falla con CS1729. Solución: pasa los argumentos, o añade un constructor sin parámetros explícito.

Practica ahora