Comparteix a través de


Clases de C#

Sugerencia

¿No está familiarizado con el desarrollo de software? Comience primero con los tutoriales de introducción . Encontrará clases una vez que necesite modelar objetos con comportamiento y estado.

¿Competente en otro idioma? Las clases de C# son similares a las clases de Java o C++. Desmonte la sección inicializadores de objetos para patrones específicos de C#y vea Registros para obtener una alternativa centrada en datos.

Una clase es un tipo de referencia que define un plano técnico para los objetos. Al crear una variable de un tipo de clase, la variable contiene una referencia a un objeto en el montón administrado. La variable no contiene los datos del objeto. Asignar una variable de clase a otra variable copia la referencia, por lo que ambas variables apuntan al mismo objeto. Las clases son la manera más común de definir tipos personalizados en C#. Úselos cuando necesite un comportamiento complejo, herencia o identidad compartida entre referencias.

Cuándo usar clases

Utilice una clase cuando:

  • El tipo tiene un comportamiento complejo o gestiona un estado mutable.
  • Necesita herencia para crear una clase base con especializaciones derivadas o para crear un tipo derivado que extienda una clase existente.
  • Las instancias representan una identidad compartida, no los objetos que tienen valores iguales. Dos referencias al mismo objeto deben permanecer sincronizadas.
  • El tipo es grande o de larga duración y se beneficia de la asignación del montón y la semántica de referencia.

Declarar una clase

Defina una clase con la class palabra clave seguida del nombre de tipo. Un modificador de acceso opcional controla la visibilidad. El valor predeterminado es internal. Especifique public para permitir que los llamadores de otros ensamblados usen sus tipos.

public class Customer
{
    public string Name { get; set; }

    public Customer(string name) => Name = name;
}

El cuerpo de la clase contiene campos, propiedades, métodos y eventos, denominados colectivamente miembros de clase. El nombre debe ser un nombre de identificador de C# válido.

Crear objetos

Una clase define un tipo, pero no es un objeto en sí. Cree un objeto (una instancia de la clase) con la new palabra clave :

var customer = new Customer("Allison");
Console.WriteLine(customer.Name); // Allison

La variable customer contiene una referencia al objeto, no al propio objeto. Puede asignar varias variables al mismo objeto. Los cambios a través de una referencia son visibles a través de la otra:

var c1 = new Customer("Grace");
var c2 = c1; // both variables reference the same object

c2.Name = "Hopper";
Console.WriteLine(c1.Name); // Hopper — c1 sees the change made through c2

Este comportamiento de uso compartido de referencias es una distinción entre clases y estructuras. Con estructuras, la asignación copia los datos. Lo más importante es que las clases admitan la herencia. Puede crear jerarquías en las que los tipos derivados reutilizan y especializan el comportamiento de una clase base. Las estructuras no pueden participar en jerarquías de herencia. Para obtener más información sobre la distinción, vea Tipos de valor y tipos de referencia.

Constructores e inicialización

Al crear una instancia, desea que sus campos y propiedades se inicialicen en valores útiles. C# ofrece varios enfoques: inicializadores de campo, parámetros de constructor, constructores principales y propiedades necesarias.

Los inicializadores de campo establecen un valor predeterminado directamente en la declaración de campo:

public class Container
{
    private int _capacity = 10;
}

Los inicializadores de campo asignan un valor predeterminado razonable a un campo o propiedad. Esto lo distingue de los siguientes enfoques en los que los llamadores pueden proporcionar el valor inicial.

Los parámetros del constructor requieren que los autores de llamadas proporcionen valores:

public class Container
{
    private int _capacity;

    public Container(int capacity) => _capacity = capacity;
}

Los constructores principales (C# 12+) agregan parámetros directamente a la declaración de clase. Esos parámetros están disponibles en todo el cuerpo de la clase:

public class Container(int capacity)
{
    private int _capacity = capacity;
}

Los constructores principales y inicializadores de campo pueden funcionar juntos: el inicializador _capacity = capacity de campo usa el parámetro primary-constructor como su valor. Este patrón permite capturar argumentos de constructor en campos con una declaración única y concisa.

Las propiedades necesarias exigen que los autores de llamada establezcan propiedades específicas a través de un inicializador de objeto:

public class Person
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
}
// var missing = new Person(); // Error: required properties not set
var person = new Person { FirstName = "Grace", LastName = "Hopper" };
Console.WriteLine($"{person.FirstName} {person.LastName}"); // Grace Hopper

Para obtener una visión más detallada de los patrones de constructor, incluida la validación de parámetros y el encadenamiento de constructores, consulte Constructores.

Clases estáticas

No se puede crear una instancia de una static clase y solo contiene miembros estáticos. Use clases estáticas para organizar métodos de utilidad que no operan en datos de instancia:

static class MathHelpers
{
    public static double CircleCircumference(double radius) =>
        2 * Math.PI * radius;
}
double circumference = MathHelpers.CircleCircumference(5.0);
Console.WriteLine($"Circumference: {circumference:F2}"); // Circumference: 31.42

La biblioteca de clases .NET incluye muchas clases estáticas, como Math y Console. Una clase estática está sellada implícitamente. No se puede derivar de ella ni crear una instancia de ella.

Inicializadores de objeto

Los inicializadores de objeto permiten establecer propiedades al crear un objeto, sin escribir un constructor para cada combinación de valores:

class ConnectionOptions
{
    public string Host { get; init; } = "localhost";
    public int Port { get; init; } = 80;
    public bool UseSsl { get; init; }
}
var options = new ConnectionOptions
{
    Host = "db.example.com",
    Port = 5432,
    UseSsl = true
};
Console.WriteLine($"{options.Host}:{options.Port} (SSL: {options.UseSsl})");
// db.example.com:5432 (SSL: True)

Los inicializadores de objeto funcionan con cualquier propiedad accesible que tenga un set o init descriptor de acceso. Combinan de forma natural con required propiedades y con constructores que aceptan algunos parámetros, al tiempo que permiten que el autor de la llamada establezca otros.

Cuando la propiedad es una colección, puede usar expresiones de colección (referencia de C#) para inicializar ese objeto.

Herencia

Las clases admiten la herencia. Puede definir una nueva clase que reutilice, extienda o modifique el comportamiento de una clase existente. La clase que hereda de es la clase base y la nueva clase es la clase derivada:

var manager = new Manager("Satya", "Engineering");
Console.WriteLine($"{manager.Name} manages {manager.Department}");
// Satya manages Engineering

Una clase puede heredar de una clase base e implementar varias interfaces. Las clases derivadas heredan todos los miembros de la clase base excepto los constructores. Para obtener más información, consulte Herencia e interfaces.

Consulte también