Clases (Guía de programación de C#)Classes (C# Programming Guide)

Tipos de referenciaReference types

Un tipo que se define como una clase, es un tipo de referencia.A type that is defined as a class is a reference type. Al declarar una variable de un tipo de referencia en tiempo de ejecución, esta contendrá el valor null hasta que se cree expresamente una instancia de la clase mediante el operador new o se le asigne un objeto de un tipo compatible que se ha creado en otro lugar, tal y como se muestra en el ejemplo siguiente:At run time, when you declare a variable of a reference type, the variable contains the value null until you explicitly create an instance of the class by using the new operator, or assign it an object of a compatible type that may have been created elsewhere, as shown in the following example:

//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.When the object is created, enough memory is allocated on the managed heap for that specific object, and the variable holds only a reference to the location of said object. 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.Types on the managed heap require overhead both when they are allocated and when they are reclaimed by the automatic memory management functionality of the CLR, which is known as garbage collection. 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.However, garbage collection is also highly optimized and in most scenarios, it does not create a performance issue. 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.For more information about garbage collection, see Automatic memory management and garbage collection.

Declarar clasesDeclaring Classes

Las clases se declaran mediante la palabra clave class seguida por un identificador único, como se muestra en el siguiente ejemplo:Classes are declared by using the class keyword followed by a unique identifier, as shown in the following example:

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

La palabra clave class va precedida del nivel de acceso.The class keyword is preceded by the access level. Como en este caso se usa public, cualquier usuario puede crear instancias de esta clase.Because public is used in this case, anyone can create instances of this class. El nombre de la clase sigue a la palabra clave class.The name of the class follows the class keyword. El nombre de la clase debe ser un nombre de identificador de C# válido.The name of the class must be a valid C# identifier name. El resto de la definición es el cuerpo de la clase, donde se definen los datos y el comportamiento.The remainder of the definition is the class body, where the behavior and data are defined. Los campos, las propiedades, los métodos y los eventos de una clase se denominan de manera colectiva miembros de clase.Fields, properties, methods, and events on a class are collectively referred to as class members.

Creación de objetosCreating objects

Aunque a veces se usan indistintamente, una clase y un objeto son cosas diferentes.Although they are sometimes used interchangeably, a class and an object are different things. Una clase define un tipo de objeto, pero no es un objeto en sí.A class defines a type of object, but it is not an object itself. Un objeto es una entidad concreta basada en una clase y, a veces, se conoce como una instancia de una clase.An object is a concrete entity based on a class, and is sometimes referred to as an instance of a class.

Los objetos se pueden crear usando la palabra clave new, seguida del nombre de la clase en la que se basará el objeto, como en este ejemplo:Objects can be created by using the new keyword followed by the name of the class that the object will be based on, like this:

Customer object1 = new Customer();

Cuando se crea una instancia de una clase, se vuelve a pasar al programador una referencia al objeto.When an instance of a class is created, a reference to the object is passed back to the programmer. En el ejemplo anterior, object1 es una referencia a un objeto que se basa en Customer.In the previous example, object1 is a reference to an object that is based on Customer. Esta referencia apunta al objeto nuevo, pero no contiene los datos del objeto.This reference refers to the new object but does not contain the object data itself. De hecho, puede crear una referencia de objeto sin tener que crear ningún objeto:In fact, you can create an object reference without creating an object at all:

 Customer object2;

No se recomienda crear referencias de objeto como esta, que no hace referencia a ningún objeto, ya que, si se intenta obtener acceso a un objeto a través de este tipo de referencia, se producirá un error en tiempo de ejecución.We don't recommend creating object references such as this one that don't refer to an object because trying to access an object through such a reference will fail at run time. Pero dicha referencia puede haberse creado para hacer referencia a un objeto, ya sea creando un nuevo objeto o asignándola a un objeto existente, como en el siguiente ejemplo:However, such a reference can be made to refer to an object, either by creating a new object, or by assigning it to an existing object, such as this:

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

Este código crea dos referencias de objeto que hacen referencia al mismo objeto.This code creates two object references that both refer to the same object. Por lo tanto, los cambios efectuados en el objeto mediante object3 se reflejan en los usos posteriores de object4.Therefore, any changes to the object made through object3 are reflected in subsequent uses of object4. Dado que los objetos basados en clases se tratan por referencia, las clases se denominan "tipos de referencia".Because objects that are based on classes are referred to by reference, classes are known as reference types.

Herencia de clasesClass inheritance

Las clases admiten completamente la herencia, una característica fundamental de la programación orientada a objetos.Classes fully support inheritance, a fundamental characteristic of object-oriented programming. Al crear una clase, puede heredar de cualquier otra interfaz o clase que no esté definida como sealed; y otras clases pueden heredar de su clase e invalidar los métodos virtuales de la clase.When you create a class, you can inherit from any other interface or class that is not defined as sealed, and other classes can inherit from your class and override class virtual methods.

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.Inheritance is accomplished by using a derivation, which means a class is declared by using a base class from which it inherits data and behavior. 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:A base class is specified by appending a colon and the name of the base class following the derived class name, like this:

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.When a class declares a base class, it inherits all the members of the base class except the constructors. Para obtener más información, vea Herencia.For more information, see Inheritance.

A diferencia de C++, una clase de C# solo puede heredar directamente de una clase base.Unlike C++, a class in C# can only directly inherit from one base class. En cambio, dado que una clase base puede heredar de otra clase, una clase podría heredar indirectamente varias clases base.However, because a base class may itself inherit from another class, a class may indirectly inherit multiple base classes. Además, una clase puede implementar directamente más de una interfaz.Furthermore, a class can directly implement more than one interface. Para obtener más información, vea Interfaces.For more information, see Interfaces.

Una clase puede declararse abstracta.A class can be declared abstract. Una clase abstracta contiene métodos abstractos que tienen una definición de firma, pero no tienen ninguna implementación.An abstract class contains abstract methods that have a signature definition but no implementation. No se pueden crear instancias de las clases abstractas.Abstract classes cannot be instantiated. Solo se pueden usar a través de las clases derivadas que implementan los métodos abstractos.They can only be used through derived classes that implement the abstract methods. Por el contrario, la clase sealed no permite que otras clases se deriven de ella.By contrast, a sealed class does not allow other classes to derive from it. Para más información, vea Clases y miembros de clase abstractos y sellados.For more information, see Abstract and Sealed Classes and Class Members.

Las definiciones de clase se pueden dividir entre distintos archivos de código fuente.Class definitions can be split between different source files. Para más información, vea Clases y métodos parciales.For more information, see Partial Classes and Methods.

EjemploExample

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.The following example defines a public class that contains an auto-implemented property, a method, and a special method called a constructor. Para obtener más información, consulta los temas Propiedades, Métodos y Constructores.For more information, see Properties, Methods, and Constructors topics. Luego, se crea una instancia de las instancias de la clase con la palabra clave new.The instances of the class are then instantiated with the new keyword.

using System;

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

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:
// unknown
// Sarah Jones
// Sarah Jones

Especificación del lenguaje C#C# Language Specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also