Clases y estructuras (Guía de programación de C#)Classes and Structs (C# Programming Guide)

Las clases (class) y estructuras (struct) son dos de las construcciones básicas de Common Type System en .NET Framework.Classes and structs are two of the basic constructs of the common type system in the .NET Framework. Cada una de ellas es básicamente una estructura de datos que encapsula un conjunto de datos y comportamientos que forman un conjunto como una unidad lógica.Each is essentially a data structure that encapsulates a set of data and behaviors that belong together as a logical unit. Los datos y comportamientos son los miembros de la clase o estructura, e incluyen sus métodos, propiedades y eventos, entre otros elementos, como se muestra más adelante en este tema.The data and behaviors are the members of the class or struct, and they include its methods, properties, and events, and so on, as listed later in this topic.

Una declaración de clase o estructura es como un plano que se utiliza para crear instancias u objetos en tiempo de ejecución.A class or struct declaration is like a blueprint that is used to create instances or objects at run time. Si define una clase o estructura llamada Person, Person es el nombre del tipo.If you define a class or struct called Person, Person is the name of the type. Si declara e inicializa una variable p de tipo Person, se dice que p es un objeto o instancia de Person.If you declare and initialize a variable p of type Person, p is said to be an object or instance of Person. Se pueden crear varias instancias del mismo tipo Person, y cada instancia tiene diferentes valores en sus propiedades y campos.Multiple instances of the same Person type can be created, and each instance can have different values in its properties and fields.

Una clase es un tipo de referencia.A class is a reference type. Cuando se crea un objeto de la clase, la variable a la que se asigna el objeto contiene solo una referencia a esa memoria.When an object of the class is created, the variable to which the object is assigned holds only a reference to that memory. Cuando la referencia de objeto se asigna a una nueva variable, la nueva variable hace referencia al objeto original.When the object reference is assigned to a new variable, the new variable refers to the original object. Los cambios realizados en una variable se reflejan en la otra variable porque ambas hacen referencia a los mismos datos.Changes made through one variable are reflected in the other variable because they both refer to the same data.

Una estructura es un tipo de valor.A struct is a value type. Cuando se crea una estructura, la variable a la que se asigna la estructura contiene los datos reales de ella.When a struct is created, the variable to which the struct is assigned holds the struct's actual data. Cuando la estructura se asigna a una nueva variable, se copia.When the struct is assigned to a new variable, it is copied. Por lo tanto, la nueva variable y la variable original contienen dos copias independientes de los mismos datos.The new variable and the original variable therefore contain two separate copies of the same data. Los cambios realizados en una copia no afectan a la otra copia.Changes made to one copy do not affect the other copy.

En general, las clases se utilizan para modelar comportamientos más complejos, o datos que se prevén modificar después de haber creado un objeto de clase.In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. Las estructuras son más adecuadas para las estructuras de datos pequeñas que contienen principalmente datos que no se prevén modificar después de haber creado la estructura.Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created.

Para más información, vea Clases, Objectos y Estructuras.For more information, see Classes, Objects, and Structs.

EjemploExample

En el ejemplo siguiente, CustomClass en el espacio de nombres ProgrammingGuide tiene tres miembros: un constructor de instancia, una propiedad denominada Number y un método denominado Multiply.In the following example, CustomClass in the ProgrammingGuide namespace has three members: an instance constructor, a property named Number, and a method named Multiply. El método Main de la clase Program crea una instancia (objeto) de CustomClass, y se puede acceder a la propiedad y al método del objeto mediante una notación de puntos.The Main method in the Program class creates an instance (object) of CustomClass, and the object’s method and property are accessed by using dot notation.

using System;

namespace ProgrammingGuide
{
   // Class definition.
   public class CustomClass
   {
      // Class members.
      //
      // Property.
      public int Number { get; set; }

      // Method.
      public int Multiply(int num)
      {
          return num * Number;
      }

      // Instance Constructor.
      public CustomClass()
      {
          Number = 0;
      }
   }

   // Another class definition that contains Main, the program entry point.
   class Program
   {
      static void Main(string[] args)
      {
         // Create an object of type CustomClass.
         CustomClass custClass = new CustomClass();

         // Set the value of the public property.
         custClass.Number = 27;

         // Call the public method.
         int result = custClass.Multiply(4);
         Console.WriteLine($"The result is {result}.");
      }
   }
}
// The example displays the following output:
//      The result is 108. 

EncapsulaciónEncapsulation

A veces se hace referencia a la encapsulación como el primer pilar o principio de la programación orientada a objetos.Encapsulation is sometimes referred to as the first pillar or principle of object-oriented programming. Según el principio de encapsulación, una clase o una estructura pueden especificar hasta qué punto se puede acceder a sus miembros para codificar fuera de la clase o la estructura.According to the principle of encapsulation, a class or struct can specify how accessible each of its members is to code outside of the class or struct. No se prevé el uso de los métodos y las variables fuera de la clase, o el ensamblado puede ocultarse para limitar el potencial de los errores de codificación o de los ataques malintencionados.Methods and variables that are not intended to be used from outside of the class or assembly can be hidden to limit the potential for coding errors or malicious exploits.

Para más información sobre las clases, vea Clases y Objetos.For more information about classes, see Classes and Objects.

MiembrosMembers

Todos los métodos, campos, constantes, propiedades y eventos deben declararse dentro de un tipo; se les denomina miembros del tipo.All methods, fields, constants, properties, and events must be declared within a type; these are called the members of the type. En C#, no hay métodos ni variables globales como en otros lenguajes.In C#, there are no global variables or methods as there are in some other languages. Incluso un punto de entrada del programa, el método Main, debe declararse dentro de una clase o estructura.Even a program's entry point, the Main method, must be declared within a class or struct. La lista siguiente incluye los diversos tipos de miembros que se pueden declarar en una clase o estructura.The following list includes all the various kinds of members that may be declared in a class or struct.

AccesibilidadAccessibility

Algunos métodos y propiedades están diseñados para ser invocables y accesibles desde el código fuera de la clase o la estructura, lo que se conoce como código de cliente.Some methods and properties are meant to be called or accessed from code outside your class or struct, known as client code. Otros métodos y propiedades pueden estar indicados exclusivamente para utilizarse en la propia clase o estructura.Other methods and properties might be only for use in the class or struct itself. Es importante limitar la accesibilidad del código, a fin de que solo el código de cliente previsto pueda acceder a él.It is important to limit the accessibility of your code so that only the intended client code can reach it. Puede usar los modificadores de acceso public, protected, internal, protected internal, private y private protected para especificar hasta qué punto los tipos y sus miembros son accesibles para el código de cliente.You specify how accessible your types and their members are to client code by using the access modifiers public, protected, internal, protected internal, private and private protected. La accesibilidad predeterminada es private.The default accessibility is private. Para obtener más información, consulte Modificadores de acceso.For more information, see Access Modifiers.

HerenciaInheritance

Las clases (pero no las estructuras) admiten el concepto de herencia.Classes (but not structs) support the concept of inheritance. Una clase que deriva de otra clase (la clase base) contiene automáticamente todos los miembros públicos, protegidos e internos de la clase base, salvo sus constructores y finalizadores.A class that derives from another class (the base class) automatically contains all the public, protected, and internal members of the base class except its constructors and finalizers. Para más información, vea Herencia y Polimorfismo.For more information, see Inheritance and Polymorphism.

Las clases pueden declararse como abstract, lo que significa que uno o varios de sus métodos no tienen ninguna implementación.Classes may be declared as abstract, which means that one or more of their methods have no implementation. Aunque no se pueden crear instancias de clases abstractas directamente, pueden servir como clases base para otras clases que proporcionan la implementación que falta.Although abstract classes cannot be instantiated directly, they can serve as base classes for other classes that provide the missing implementation. Las clases también pueden declararse como sealed para evitar que otras clases hereden de ellas.Classes can also be declared as sealed to prevent other classes from inheriting from them. 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.

InterfacesInterfaces

Las clases y las estructuras pueden heredar varias interfaces.Classes and structs can inherit multiple interfaces. Heredar de una interfaz significa que el tipo implementa todos los métodos definidos en la interfaz.To inherit from an interface means that the type implements all the methods defined in the interface. Para más información, vea Interfaces.For more information, see Interfaces.

Tipos genéricosGeneric Types

Las clases y estructuras pueden definirse con uno o varios parámetros de tipo.Classes and structs can be defined with one or more type parameters. El código de cliente proporciona el tipo cuando crea una instancia del tipo.Client code supplies the type when it creates an instance of the type. Por ejemplo, la clase List<T> del espacio de nombres System.Collections.Generic se define con un parámetro de tipo.For example The List<T> class in the System.Collections.Generic namespace is defined with one type parameter. El código de cliente crea una instancia de List<string> o List<int> para especificar el tipo que contendrá la lista.Client code creates an instance of a List<string> or List<int> to specify the type that the list will hold. Para más información, vea Genéricos.For more information, see Generics.

Tipos estáticosStatic Types

Las clases (pero no las estructuras) pueden declararse como static.Classes (but not structs) can be declared as static. Una clase estática puede contener solo miembros estáticos y no se puede crear una instancia de ellos con la palabra clave new.A static class can contain only static members and cannot be instantiated with the new keyword. Una copia de la clase se carga en memoria cuando se carga el programa, y sus miembros son accesibles a través del nombre de clase.One copy of the class is loaded into memory when the program loads, and its members are accessed through the class name. Las clases y estructuras pueden contener miembros estáticos.Both classes and structs can contain static members. Para más información, vea Clases estáticas y sus miembros.For more information, see Static Classes and Static Class Members.

Tipos anidadosNested Types

Una clase o estructura se puede anidar dentro de otra clase o estructura.A class or struct can be nested within another class or struct. Para obtener más información, consulte Tipos anidados.For more information, see Nested Types.

Tipos parcialesPartial Types

Puede definir parte de una clase, estructura o método en un archivo de código y otra parte en un archivo de código independiente.You can define part of a class, struct or method in one code file and another part in a separate code file. Para más información, vea Clases y métodos parciales.For more information, see Partial Classes and Methods.

Inicializadores de objetoObject Initializers

Puede crear instancias de objetos de clase o estructura y de colecciones de objetos e iniciarlizarlos, sin llamar de forma explícita a su constructor.You can instantiate and initialize class or struct objects, and collections of objects, without explicitly calling their constructor. Para más información, vea Inicializadores de objeto y de colección.For more information, see Object and Collection Initializers.

Tipos anónimosAnonymous Types

En situaciones donde no es conveniente o necesario crear una clase con nombre, por ejemplo al rellenar una lista con estructuras de datos que no tiene que conservar o pasar a otro método, utilice los tipos anónimos.In situations where it is not convenient or necessary to create a named class, for example when you are populating a list with data structures that you do not have to persist or pass to another method, you use anonymous types. Para más información, vea Tipos anónimos.For more information, see Anonymous Types.

Métodos de extensión.Extension Methods

Puede "extender" una clase sin crear una clase derivada mediante la creación de un tipo independiente cuyos métodos pueden llamarse como si pertenecieran al tipo original.You can "extend" a class without creating a derived class by creating a separate type whose methods can be called as if they belonged to the original type. Para más información, vea Métodos de extensión.For more information, see Extension Methods.

Variables locales con asignación implícita de tiposImplicitly Typed Local Variables

Dentro de un método de clase o estructura, puede utilizar tipos implícitos para indicar al compilador que determine el tipo correcto en tiempo de compilación.Within a class or struct method, you can use implicit typing to instruct the compiler to determine the correct type at compile time. Para más información, vea Variables locales con asignación implícita de tipos.For more information, see Implicitly Typed Local Variables.

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