Introducción a las clases

Tipos de referencia

Un tipo que se define como es class un tipo class. En tiempo de ejecución, cuando se declara una variable de un tipo de referencia, la variable nullnew contiene el valor hasta que se crea explícitamente una instancia de la clase mediante el operador o se le asigna un objeto de un tipo compatible que se puede haber creado en otro lugar, como se muestra en el ejemplo siguiente:

//Declaring an object of type MyClass.
MyClass mc = new MyClass();

//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;

Cuando se crea el objeto, se asigna suficiente memoria en el montón administrado para ese objeto específico y la variable solo contiene una referencia a la ubicación de dicho objeto. Los tipos del montón administrado producen sobrecarga cuando se asignan y cuando los reclama la función de administración de memoria automática de CLR, conocida como recolección de elementos no utilizados. En cambio, la recolección de elementos no utilizados también está muy optimizada y no crea problemas de rendimiento en la mayoría de los escenarios. Para obtener más información sobre la recolección de elementos no utilizados, vea Administración automática de la memoria y recolección de elementos no utilizados.

Declarar clases

Las clases se declaran mediante la palabra class clave seguido de un identificador único, como se muestra en el ejemplo siguiente:

//[access modifier] - [class] - [identifier]
public class Customer
{
   // Fields, properties, methods and events go here...
}

La palabra clave class va precedida del nivel de acceso. Dado public que se usa en este caso, cualquier persona puede crear instancias de esta clase. El nombre de la clase sigue a la palabra clave class. El nombre de la clase debe ser un nombre de identificador de C# válido. El resto de la definición es el cuerpo de la clase, donde se definen los datos y el comportamiento. Los campos, las propiedades, los métodos y los eventos de una clase se denominan de manera colectiva miembros de clase.

Creación de objetos

Aunque a veces se usan indistintamente, una clase y un objeto son cosas diferentes. Una clase define un tipo de objeto, pero no es un objeto en sí. Un objeto es una entidad concreta basada en una clase y, a veces, se conoce como una instancia de una clase.

Los objetos se pueden crear mediante la palabra new clave seguido del nombre de la clase en la que se basará el objeto, de la siguiente manera:

Customer object1 = new Customer();

Cuando se crea una instancia de una clase, se vuelve a pasar al programador una referencia al objeto. En el ejemplo anterior, object1 es una referencia a un objeto que se basa en Customer. Esta referencia apunta al objeto nuevo, pero no contiene los datos del objeto. De hecho, puede crear una referencia de objeto sin tener que crear ningún objeto:

 Customer object2;

No se recomienda crear referencias de objeto como la anterior que no hacen referencia a un objeto porque se producirá un error al intentar acceder a un objeto a través de dicha referencia en tiempo de ejecución. Pero este tipo de referencia se puede haber creado para hacer referencia a un objeto, ya sea creando uno o asignándola a un objeto existente, como en el ejemplo siguiente:

Customer object3 = new Customer();
Customer object4 = object3;

Este código crea dos referencias de objeto que hacen referencia al mismo objeto. Por lo tanto, los cambios efectuados en el objeto mediante object3 se reflejan en los usos posteriores de object4. Dado que los objetos basados en clases se tratan por referencia, las clases se denominan "tipos de referencia".

Herencia de clases

Las clases admiten completamente la herencia, una característica fundamental de la programación orientada a objetos. Al crear una clase, puede sealedheredar de cualquier otra clase que no esté definida como , y otras clases pueden heredar de la clase e invalidar los métodos virtuales de clase. Además, puede implementar una o varias interfaces.

La herencia se consigue mediante una derivación, en la que se declara una clase mediante una clase base, desde la que hereda los datos y el comportamiento. Una clase base se especifica anexando dos puntos y el nombre de la clase base seguido del nombre de la clase derivada, como en el siguiente ejemplo:

public class Manager : Employee
{
    // Employee fields, properties, methods and events are inherited
    // New Manager fields, properties, methods and events go here...
}

Cuando una clase declara una clase base, hereda todos los miembros de la clase base excepto los constructores. Para obtener más información, vea Herencia.

Una clase de C# solo puede heredar directamente de una clase base. En cambio, dado que una clase base puede heredar de otra clase, una clase podría heredar indirectamente varias clases base. Además, una clase puede implementar directamente una o varias interfaces. Para obtener más información, vea Interfaces.

Una clase se puede declarar abstractcomo . Una clase abstracta contiene métodos abstractos que tienen una definición de firma, pero no tienen ninguna implementación. No se pueden crear instancias de las clases abstractas. Solo se pueden usar a través de las clases derivadas que implementan los métodos abstractos. Por el contrario, la clase sealed no permite que otras clases se deriven de ella. Para más información, vea Clases y miembros de clase abstractos y sellados.

Las definiciones de clase se pueden dividir entre distintos archivos de código fuente. Para más información, vea Clases y métodos parciales.

Ejemplo

En el ejemplo siguiente se define una clase pública que contiene una propiedad implementada automáticamente, un método y un método especial denominado constructor. Para obtener más información, vea los artículos Propiedades, Métodos y Constructores. Luego, se crea una instancia de las instancias de la clase con la palabra clave new.

public class Person
{
    // Constructor that takes no arguments:
    public Person()
    {
        Name = "unknown";
    }

    // Constructor that takes one argument:
    public Person(string name)
    {
        Name = name;
    }

    // Auto-implemented readonly property:
    public string Name { get; }

    // Method that overrides the base class (System.Object) implementation.
    public override string ToString()
    {
        return Name;
    }
}
class TestPerson
{
    static void Main()
    {
        // Call the constructor that has no parameters.
        var person1 = new Person();
        Console.WriteLine(person1.Name);

        // Call the constructor that has one parameter.
        var person2 = new Person("Sarah Jones");
        Console.WriteLine(person2.Name);
        // Get the string representation of the person2 instance.
        Console.WriteLine(person2);
    }
}
// Output:
// unknown
// Sarah Jones
// Sarah Jones

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.