Programación orientada a objetos (C#)Object-Oriented Programming (C#)

C# proporciona compatibilidad completa para la programación orientada a objetos incluida la encapsulación, la herencia y el polimorfismo.C# provides full support for object-oriented programming including encapsulation, inheritance, and polymorphism.

La encapsulación significa que un grupo de propiedades, métodos y otros miembros relacionados se tratan como una sola unidad u objeto.Encapsulation means that a group of related properties, methods, and other members are treated as a single unit or object.

La herencia describe la posibilidad de crear nuevas clases basadas en una clase existente.Inheritance describes the ability to create new classes based on an existing class.

El polimorfismo significa que puede tener múltiples clases que se pueden usar de manera intercambiable, aunque cada clase implementa las mismas propiedades o los mismos métodos de maneras diferentes.Polymorphism means that you can have multiple classes that can be used interchangeably, even though each class implements the same properties or methods in different ways.

En esta sección se describen los conceptos siguientes:This section describes the following concepts:

Clases y objetosClasses and Objects

Los términos clase y objeto se usan a veces indistintamente pero, en realidad, las clases describen el tipo de los objetos, mientras que los objetos son instancias de clases que se pueden usar.The terms class and object are sometimes used interchangeably, but in fact, classes describe the type of objects, while objects are usable instances of classes. Así, la acción de crear un objeto se denomina creación de instancias.So, the act of creating an object is called instantiation. Con la analogía de plano, una clase es un plano y un objeto es un edificio construido a partir de ese plano.Using the blueprint analogy, a class is a blueprint, and an object is a building made from that blueprint.

Para definir una clase:To define a class:

class SampleClass
{
}

C# también proporciona una versión ligera de las clases denominadas estructuras, que resultan útiles cuando es necesario crear una matriz grande de objetos y no quiere usar demasiada memoria para ello.C# also provides a light version of classes called structures that are useful when you need to create large array of objects and do not want to consume too much memory for that.

Para definir una estructura:To define a structure:

struct SampleStruct
{
}

Para obtener más información, consulte:For more information, see:

Miembros de clasesClass Members

Cada clase puede tener distintos miembros de clase, entre los que se incluyen las propiedades que describen los datos de clase, los métodos que definen el comportamiento de la clase y los eventos que proporcionan comunicación entre distintos objetos y clases.Each class can have different class members that include properties that describe class data, methods that define class behavior, and events that provide communication between different classes and objects.

Propiedades y camposProperties and Fields

Los campos y propiedades representan información que contiene un objeto.Fields and properties represent information that an object contains. Los campos se parecen a las variables ya que se pueden leer y establecer directamente.Fields are like variables because they can be read or set directly.

Para definir un campo:To define a field:

class SampleClass
{
    public string sampleField;
}

Las propiedades tienen procedimientos get y set, que proporcionan un mayor control sobre la forma en que se establecen o devuelven los valores.Properties have get and set procedures, which provide more control on how values are set or returned.

C# le permite crear un campo privado para almacenar el valor de propiedad o usar las denominadas propiedades de implementación automática que crean este campo en segundo plano automáticamente y proporcionan la lógica básica para los procedimientos de propiedad.C# allows you either to create a private field for storing the property value or use so-called auto-implemented properties that create this field automatically behind the scenes and provide the basic logic for the property procedures.

Para definir una propiedad implementada automáticamente:To define an auto-implemented property:

class SampleClass
{
    public int SampleProperty { get; set; }
}

Si necesita realizar algunas operaciones adicionales para leer y escribir el valor de propiedad, defina un campo para almacenar el valor de propiedad y proporcione la lógica básica para almacenarlo y recuperar lo:If you need to perform some additional operations for reading and writing the property value, define a field for storing the property value and provide the basic logic for storing and retrieving it:

class SampleClass
{
    private int _sample;
    public int Sample
    {
        // Return the value stored in a field.
        get { return _sample; }
        // Store the value in the field.
        set { _sample = value; }
    }
}

La mayoría de las propiedades tienen métodos o procedimientos tanto para establecer como para obtener el valor de propiedad.Most properties have methods or procedures to both set and get the property value. Sin embargo, se pueden crear propiedades de solo lectura o solo escritura para restringir su modificación o lectura.However, you can create read-only or write-only properties to restrict them from being modified or read. En C#, se puede omitir el método de propiedad get o set.In C#, you can omit the get or set property method. En cambio, las propiedades implementadas automáticamente no pueden ser de solo lectura o de solo escritura.However, auto-implemented properties cannot be read-only or write-only.

Para obtener más información, consulte:For more information, see:

MétodosMethods

Un método es una acción que un objeto puede realizar.A method is an action that an object can perform.

Para definir un método de una clase:To define a method of a class:

class SampleClass
{
    public int sampleMethod(string sampleParam)
    {
        // Insert code here
    }
}

Una clase puede tener varias implementaciones o sobrecargas del mismo método que se diferencian en el número de parámetros o de tipos de parámetro.A class can have several implementations, or overloads, of the same method that differ in the number of parameters or parameter types.

Para sobrecargar un método:To overload a method:

public int sampleMethod(string sampleParam) {};
public int sampleMethod(int sampleParam) {}

En la mayoría de los casos, un método se declara dentro de una definición de clase.In most cases you declare a method within a class definition. En cambio, C# también admite los métodos de extensión, que le permiten agregar métodos a una clase existente fuera de la definición de la clase actual.However, C# also supports extension methods that allow you to add methods to an existing class outside the actual definition of the class.

Para obtener más información, consulte:For more information, see:

ConstructoresConstructors

Los constructores son métodos de clase que se ejecutan automáticamente cuando se crea un objeto de un tipo determinado.Constructors are class methods that are executed automatically when an object of a given type is created. Normalmente, los constructores inicializan los miembros de datos del nuevo objeto.Constructors usually initialize the data members of the new object. Un constructor solo puede ejecutarse una vez cuando se crea una clase.A constructor can run only once when a class is created. Además, el código del constructor siempre se ejecuta antes que cualquier otro código en una clase.Furthermore, the code in the constructor always runs before any other code in a class. Sin embargo, puede crear varias sobrecargas del constructor de la misma forma que para cualquier otro método.However, you can create multiple constructor overloads in the same way as for any other method.

Para definir un constructor para una clase:To define a constructor for a class:

public class SampleClass
{
    public SampleClass()
    {
        // Add code here
    }
}

Para obtener más información, consulte:For more information, see:

Constructores.Constructors.

FinalizadoresFinalizers

Los finalizadores se usan para destruir instancias de clases.Finalizers are used to destruct instances of classes. En .NET Framework, el recolector de elementos no utilizados administra automáticamente la asignación y la liberación de memoria para los objetos administrados en la aplicación.In the .NET Framework, the garbage collector automatically manages the allocation and release of memory for the managed objects in your application. En cambio, es posible que aún se necesiten finalizadores para limpiar cualquiera de los recursos no administrados creados por la aplicación.However, you may still need finalizers to clean up any unmanaged resources that your application creates. Solo puede haber un finalizador para una clase.There can be only one finalizers for a class.

Para obtener más información sobre los finalizadores y la recolección de elementos no utilizados en .NET Framework, vea Recolección de elementos no utilizados.For more information about finalizers and garbage collection in the .NET Framework, see Garbage Collection.

EventosEvents

Cuando ocurre algo interesante, los eventos habilitan una clase u objeto para notificarlo a otras clases u objetos.Events enable a class or object to notify other classes or objects when something of interest occurs. La clase que envía (o genera) el evento recibe el nombre de publicador y las clases que reciben (o controlan) el evento se denominan suscriptores.The class that sends (or raises) the event is called the publisher and the classes that receive (or handle) the event are called subscribers. Para obtener más información sobre los eventos y la forma en que se generan y controlan, vea Eventos.For more information about events, how they are raised and handled, see Events.

  • Para declarar un evento en una clase, use la palabra clave event.To declare an event in a class, use the event keyword.

  • Para generar un evento, invoque al delegado de eventos.To raise an event, invoke the event delegate.

  • Para suscribirse a un evento, use el operador +=; para anular la suscripción de un evento, use el operador -=.To subscribe to an event, use the += operator; to unsubscribe from an event, use the -= operator.

Clases anidadasNested Classes

Una clase definida dentro de otra se denomina anidada.A class defined within another class is called nested. De forma predeterminada, una clase anidada es privada.By default, the nested class is private.

class Container
{
    class Nested
    {
        // Add code here.
    }
}

Para crear una instancia de la clase anidada, use el nombre de la clase contenedora seguido de un punto y seguido, a continuación, del nombre de la clase anidada:To create an instance of the nested class, use the name of the container class followed by the dot and then followed by the name of the nested class:

Container.Nested nestedInstance = new Container.Nested()

Modificadores y niveles de accesoAccess Modifiers and Access Levels

Todas las clases y miembros de clase pueden especificar el nivel de acceso que proporcionan a otras clases mediante los modificadores de acceso.All classes and class members can specify what access level they provide to other classes by using access modifiers.

Están disponibles los siguientes modificadores de acceso:The following access modifiers are available:

Modificador de C#C# Modifier DefiniciónDefinition
publicpublic Puede obtener acceso al tipo o miembro cualquier otro código del mismo ensamblado o de otro ensamblado que haga referencia a éste.The type or member can be accessed by any other code in the same assembly or another assembly that references it.
privateprivate Solamente puede obtener acceso al tipo o miembro el código de la misma clase.The type or member can only be accessed by code in the same class.
protectedprotected Solamente puede obtener acceso al tipo o miembro el código de la misma clase o de una clase derivada.The type or member can only be accessed by code in the same class or in a derived class.
internalinternal Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado, pero no de un ensamblado distinto.The type or member can be accessed by any code in the same assembly, but not from another assembly.
protected internalprotected internal Puede obtener acceso al tipo o miembro cualquier código del mismo ensamblado o cualquier clase derivada de otro ensamblado.The type or member can be accessed by any code in the same assembly, or by any derived class in another assembly.
private protectedprivate protected Un código de la misma clase o de una clase derivada dentro del ensamblado de clase base puede acceder al tipo o miembro en cuestión.The type or member can be accessed by code in the same class or in a derived class within the base class assembly.

Para obtener más información, consulte Modificadores de acceso.For more information, see Access Modifiers.

Creación de instancias de las clasesInstantiating Classes

Para crear un objeto, debe crear una o varias instancias de una clase.To create an object, you need to instantiate a class, or create a class instance.

SampleClass sampleObject = new SampleClass();

Una vez creadas las instancias de una clase, puede asignar valores a las propiedades y los campos de la instancia, así como invocar métodos de clase.After instantiating a class, you can assign values to the instance's properties and fields and invoke class methods.

// Set a property value.
sampleObject.sampleProperty = "Sample String";
// Call a method.
sampleObject.sampleMethod();

Para asignar valores a las propiedades durante el proceso de creación de instancias de una clase, use los inicializadores de objeto:To assign values to properties during the class instantiation process, use object initializers:

// Set a property value.
SampleClass sampleObject = new SampleClass
    { FirstProperty = "A", SecondProperty = "B" };

Para obtener más información, consulte:For more information, see:

Clases y miembros estáticosStatic Classes and Members

Un miembro estático de la clase es una propiedad, un procedimiento o un campo que comparten todas las instancias de una clase.A static member of the class is a property, procedure, or field that is shared by all instances of a class.

Para definir un miembro estático:To define a static member:

static class SampleClass
{
    public static string SampleString = "Sample String";
}

Para obtener acceso al miembro estático, use el nombre de la clase sin crear un objeto perteneciente a esta:To access the static member, use the name of the class without creating an object of this class:

Console.WriteLine(SampleClass.SampleString);

Las clases estáticas en C# solo tienen miembros estáticos y no se puede crear una instancia de ellas.Static classes in C# have static members only and cannot be instantiated. Además, los miembros estáticos no pueden tener acceso a las propiedades, los campos o los métodos no estáticos.Static members also cannot access non-static properties, fields or methods

Para obtener más información, vea: static.For more information, see: static.

Tipos anónimosAnonymous Types

Los tipos anónimos permiten crear objetos sin escribir una definición de clase para el tipo de datos.Anonymous types enable you to create objects without writing a class definition for the data type. En su lugar, el compilador genera una clase.Instead, the compiler generates a class for you. La clase no tiene ningún nombre que se pueda usar y contiene las propiedades especificadas al declarar el objeto.The class has no usable name and contains the properties you specify in declaring the object.

Para crear una instancia de un tipo anónimo:To create an instance of an anonymous type:

// sampleObject is an instance of a simple anonymous type.
var sampleObject =
    new { FirstProperty = "A", SecondProperty = "B" };

Para obtener más información, consulte: Tipos anónimos.For more information, see: Anonymous Types.

HerenciaInheritance

La herencia permite crear una nueva clase que reutiliza, extiende y modifica el comportamiento que se define en otra clase.Inheritance enables you to create a new class that reuses, extends, and modifies the behavior that is defined in another class. La clase cuyos miembros se heredan se denomina clase base y la clase que hereda esos miembros se denomina clase derivada.The class whose members are inherited is called the base class, and the class that inherits those members is called the derived class. En cambio, todas las clases de C# heredan implícitamente de la clase Object que admite la jerarquía de clases .NET y proporciona servicios de bajo nivel a todas las clases.However, all classes in C# implicitly inherit from the Object class that supports .NET class hierarchy and provides low-level services to all classes.

Nota

C# no admite la herencia múltiple.C# doesn't support multiple inheritance. Es decir, solo puede especificar una clase base para una clase derivada.That is, you can specify only one base class for a derived class.

Para heredar de una clase base:To inherit from a base class:

class DerivedClass:BaseClass {}

De forma predeterminada, todas las clases se pueden heredar.By default all classes can be inherited. Sin embargo, puede especificar si una clase no se debe usar como clase base o bien crear una clase que solo se pueda usar como clase base.However, you can specify whether a class must not be used as a base class, or create a class that can be used as a base class only.

Para especificar que una clase no se puede usar como clase base:To specify that a class cannot be used as a base class:

public sealed class A { }

Para especificar que una clase se puede usar solo como clase base y no se pueden crear instancias de esta:To specify that a class can be used as a base class only and cannot be instantiated:

public abstract class B { }

Para obtener más información, consulte:For more information, see:

Reemplazar miembrosOverriding Members

De forma predeterminada, una clase derivada hereda todos los miembros de su clase base.By default, a derived class inherits all members from its base class. Si desea cambiar el comportamiento del miembro heredado, debe invalidarlo.If you want to change the behavior of the inherited member, you need to override it. Es decir, se puede definir una nueva implementación del método, la propiedad o el evento en la clase derivada.That is, you can define a new implementation of the method, property or event in the derived class.

Los siguientes modificadores se utilizan para controlar cómo se reemplazan propiedades y métodos:The following modifiers are used to control how properties and methods are overridden:

Modificador de C#C# Modifier DefiniciónDefinition
virtualvirtual Permite invalidar un miembro de una clase derivada.Allows a class member to be overridden in a derived class.
overrideoverride Invalida un miembro virtual (invalidable) definido en la clase base.Overrides a virtual (overridable) member defined in the base class.
abstractabstract Requiere que se invalide un miembro de clase en la clase derivada.Requires that a class member to be overridden in the derived class.
new (modificador)new Modifier Oculta un miembro heredado de una clase base.Hides a member inherited from a base class

InterfacesInterfaces

Las interfaces, como las clases, definen un conjunto de propiedades, métodos y eventos.Interfaces, like classes, define a set of properties, methods, and events. Pero de forma contraria a las clases, las interfaces no proporcionan implementación.But unlike classes, interfaces do not provide implementation. Se implementan como clases y se definen como entidades separadas de las clases.They are implemented by classes, and defined as separate entities from classes. Una interfaz representa un contrato, en el cual una clase que implementa una interfaz debe implementar cualquier aspecto de dicha interfaz exactamente como esté definido.An interface represents a contract, in that a class that implements an interface must implement every aspect of that interface exactly as it is defined.

Para definir una interfaz:To define an interface:

interface ISampleInterface
{
    void doSomething();
}

Para implementar una interfaz en una clase:To implement an interface in a class:

class SampleClass : ISampleInterface
{
    void ISampleInterface.doSomething()
    {
        // Method implementation.
    }
}

Para obtener más información, consulte:For more information, see:

InterfacesInterfaces

interfaceinterface

GenéricosGenerics

Las clases, las estructuras, las interfaces y los métodos de .NET Framework pueden incluir parámetros de tipo que definen los tipos de objetos que estos pueden almacenar o usar.Classes, structures, interfaces and methods in the .NET Framework can include type parameters that define types of objects that they can store or use. El ejemplo más común de elementos genéricos es una colección, donde se puede especificar el tipo de objetos que se va a almacenar en una colección.The most common example of generics is a collection, where you can specify the type of objects to be stored in a collection.

Para definir una clase genérica:To define a generic class:

public class SampleGeneric<T>
{
    public T Field;
}

Para crear una instancia de una clase genérica:To create an instance of a generic class:

SampleGeneric<string> sampleObject = new SampleGeneric<string>();
sampleObject.Field = "Sample string";

Para obtener más información, consulte:For more information, see:

DelegadosDelegates

Un delegado es un tipo que define una firma de método y que puede proporcionar una referencia a cualquier método con una firma compatible.A delegate is a type that defines a method signature, and can provide a reference to any method with a compatible signature. Puede invocar (o llamar) al método a través del delegado.You can invoke (or call) the method through the delegate. Los delegados se utilizan para pasar métodos como argumentos a otros métodos.Delegates are used to pass methods as arguments to other methods.

Nota

Los controladores de eventos no son más que métodos que se invocan a través de delegados.Event handlers are nothing more than methods that are invoked through delegates. Para obtener más información sobre el uso de delegados en el control de eventos, vea Eventos.For more information about using delegates in event handling, see Events.

Para crear un delegado:To create a delegate:

public delegate void SampleDelegate(string str);

Para crear una referencia a un método que coincida con la firma especificada por el delegado:To create a reference to a method that matches the signature specified by the delegate:

class SampleClass
{
    // Method that matches the SampleDelegate signature.
    public static void sampleMethod(string message)
    {
        // Add code here.
    }
    // Method that instantiates the delegate.
    void SampleDelegate()
    {
        SampleDelegate sd = sampleMethod;
        sd("Sample string");
    }
}

Para obtener más información, consulte:For more information, see:

Vea tambiénSee also