Información general de clases, estructuras y registros en C#
En C#, la definición de un tipo (una clase, estructura o registro) es como un plano técnico que especifica lo que el tipo puede hacer. Un objeto es básicamente un bloque de memoria que se ha asignado y configurado de acuerdo con el plano. En este artículo se proporciona información general de estos planos técnicos y sus características. En el siguiente artículo de esta serie se presentan los objetos.
Encapsulación
A veces se hace referencia a la encapsulación como el primer pilar o principio de la programación orientada a objetos. 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. 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. Para más información, consulte el tutorial Programación orientada a objetos.
Miembros
Los miembros de un tipo incluyen todos los métodos, campos, constantes, propiedades y eventos. En C#, no hay métodos ni variables globales como en otros lenguajes. Incluso se debe declarar el punto de entrada de un programa, el método Main
, dentro de una clase o estructura (de forma implícita cuando usa instrucciones de nivel superior).
La lista siguiente incluye los diversos tipos de miembros que se pueden declarar en una clase, estructura o registro.
- Campos
- Constantes
- Propiedades
- Métodos
- Constructores
- Events
- Finalizadores
- Indexadores
- Operadores
- Tipos anidados
Para más información, consulte Miembros.
Accesibilidad
Algunos métodos y propiedades están diseñados para ser invocables y accesibles desde el código fuera de una clase o estructura, lo que se conoce como código de cliente. Otros métodos y propiedades pueden estar indicados exclusivamente para utilizarse en la propia clase o estructura. Es importante limitar la accesibilidad del código, a fin de que solo el código de cliente previsto pueda acceder a él. Puede usar los siguientes modificadores de acceso para especificar hasta qué punto los tipos y sus miembros son accesibles para el código de cliente:
La accesibilidad predeterminada es private
.
Herencia
Las clases (pero no las estructuras) admiten el concepto de herencia. Una clase que deriva de otra clase (denominada clase base) contiene automáticamente todos los miembros públicos, protegidos e internos de la clase base, salvo sus constructores y finalizadores.
Las clases pueden declararse como abstract, lo que significa que uno o varios de sus métodos no tienen ninguna implementación. 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. Las clases también pueden declararse como sealed para evitar que otras clases hereden de ellas.
Para más información, vea Herencia y Polimorfismo.
Interfaces
Las clases, las estructuras y los registros pueden implementar varias interfaces. Implementar de una interfaz significa que el tipo implementa todos los métodos definidos en la interfaz. Para más información, vea Interfaces.
Tipos genéricos
Las clases, las estructuras y los registros pueden definirse con uno o varios parámetros de tipo. El código de cliente proporciona el tipo cuando crea una instancia del tipo. Por ejemplo, la clase List<T> del espacio de nombres System.Collections.Generic se define con un parámetro de tipo. El código de cliente crea una instancia de List<string>
o List<int>
para especificar el tipo que contendrá la lista. Para más información, vea Genéricos.
Tipos estáticos
Las clases (pero no las estructuras ni los registros) pueden declararse como 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
. 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. Las clases, las estructuras y los registros pueden contener miembros estáticos. Para obtener más información, vea Clases estáticas y sus miembros.
Tipos anidados
Una clase, estructura o registro se puede anidar dentro de otra clase, estructura o registro. Para obtener más información, consulte Tipos anidados.
Tipos parciales
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. Para más información, vea Clases y métodos parciales.
Inicializadores de objeto
Puede crear instancias e inicializar objetos de clase o estructura, así como colecciones de objetos, asignando valores a sus propiedades. Para más información, consulte Procedimiento para inicializar un objeto mediante un inicializador de objeto.
Tipos anónimos
En situaciones donde no es conveniente o necesario crear una clase con nombre, utilice los tipos anónimos. Los tipos anónimos se definen mediante sus miembros de datos con nombre. Para obtener más información, consulte Tipos anónimos (Guía de programación de C#).
Métodos de extensión
Puede "extender" una clase sin crear una clase derivada mediante la creación de un tipo independiente. Ese tipo contiene métodos a los que se puede llamar como si perteneciesen al tipo original. Para más información, consulte Métodos de extensión.
Variables locales con asignación implícita de tipos
Dentro de un método de clase o estructura, puede utilizar tipos implícitos para indicar al compilador que determine el tipo de una variable en tiempo de compilación. Para más información, consulte var (referencia de C#).
Registros
C# 9 presenta el tipo record
, un tipo de referencia que se puede crear en lugar de una clase o una estructura. Los registros son clases con un comportamiento integrado para encapsular datos en tipos inmutables. C# 10 presenta el tipo de valor record struct
. Un registro (record class
o record struct
) proporciona las siguientes características:
- Sintaxis concisa para crear un tipo de referencia con propiedades inmutables.
- Igualdad de valores. Dos variables de un tipo de registro son iguales si tienen el mismo tipo y si, por cada campo, los valores en ambos registros son iguales. Las clases usan la igualdad de referencia: dos variables de un tipo de clase son iguales si hacen referencia al mismo objeto.
- Sintaxis concisa para la mutación no destructiva.
Una expresión
with
permite crear una copia de una instancia de registro existente, pero con los valores de propiedad especificados modificados. - Formato integrado para la presentación.
El método
ToString
imprime el nombre del tipo de registro y los nombres y valores de las propiedades públicas. - Compatibilidad con jerarquías de herencia en clases de registro. Las clases de registro admiten la herencia. Las clases de structs no admiten la herencia.
Para obtener más información, consulte Registros.
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#.