Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tutorial se explica cómo crear tipos en C#. Puede escribir pequeñas cantidades de código y, a continuación, compilar y ejecutar ese código. El tutorial contiene una serie de lecciones que exploran diferentes tipos de tipos en C#. Estas lecciones le enseñan los aspectos básicos del lenguaje C#.
Sugerencia
Cuando un bloque de fragmento de código incluye el botón "Ejecutar", ese botón abre la ventana interactiva o reemplaza el código existente en la ventana interactiva. Cuando el fragmento de código no incluye un botón "Ejecutar", puede copiar el código y agregarlo a la ventana interactiva actual.
Los tutoriales anteriores trabajaron con texto y números. Las cadenas y los números son tipos simples: cada uno almacena un solo valor. A medida que los programas crecen más grandes, debe trabajar con estructuras de datos más sofisticadas. C# proporciona diferentes tipos de tipos que puede definir cuando se necesitan estructuras de datos con más campos, propiedades o comportamiento. Empecemos a explorar esos tipos.
Tuplas
Las tuplas son una secuencia ordenada de valores con una longitud fija. Cada elemento de una tupla tiene un tipo y un nombre opcional. El código siguiente declara una tupla que representa un punto 2D. Seleccione el botón "Ejecutar" para pegar el código siguiente en la ventana interactiva y ejecutarlo.
var pt = (X: 1, Y: 2);
var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");
Sugerencia
Al explorar C# (o cualquier lenguaje de programación), se cometen errores al escribir código. El compilador busca esos errores e informa de ellos. Cuando la salida contiene mensajes de error, examine detenidamente el código de ejemplo y el código de la ventana interactiva para ver qué corregir. Este ejercicio le ayuda a aprender la estructura del código de C#.
Puede reasignar cualquier miembro de una tupla. Agregue el código siguiente en la ventana interactiva después del código existente. Presione "Ejecutar" de nuevo para ver los resultados.
pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");
También puede crear una nueva tupla que sea una copia modificada del original usando una expresión with
. Agregue el código siguiente después del código ya en la ventana interactiva y presione "Ejecutar" para ver los resultados:
var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");
La tupla pt2
contiene el X
valor de pt
(6) y pt2.Y
es 10.
Las tuplas son tipos estructurales. En otras palabras, los tipos de tupla no tienen nombres como string
o int
. Un tipo de tupla se define por el número de miembros, conocido como aridad, y los tipos de estos miembros. Los nombres de miembro son para mayor comodidad. Se puede asignar una tupla a otra tupla que tenga la misma aridad y tipos, incluso si sus miembros tienen nombres diferentes. Puede agregar el código siguiente después del código que ya escribió en la ventana interactiva e intentarlo:
var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);
La variable subscript
tiene dos miembros, ambos son enteros. Tanto subscript
como pt
representan instancias del mismo tipo de tupla: una tupla que contiene 2 miembros int
.
Las tuplas son fáciles de crear: se declaran varios miembros entre paréntesis. Las siguientes declaraciones identifican tuplas diferentes con distintas aridades y tipos de miembros. Agregue el código siguiente para crear nuevos tipos de tuplas:
var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);
Las tuplas son fáciles de crear, pero están limitadas en sus funcionalidades. Los tipos de tuplas no llevan nombres, por lo que no se puede transmitir un significado al conjunto de valores. Los tipos de tupla no pueden agregar comportamiento. C# tiene otros tipos de tipos que puede crear cuando el tipo define el comportamiento.
Creación de tipos de registro
Las tuplas son excelentes para esas veces cuando se quieren varios valores en la misma estructura. Son ligeros y se pueden declarar a medida que se usan. A medida que vaya el programa, es posible que encuentre que usa el mismo tipo de tupla en todo el código. Si la aplicación funciona en el espacio de grafos 2D, las tuplas que representan puntos pueden ser comunes. Una vez que lo encuentre, puede declarar un record
tipo que almacene esos valores y proporcione más funcionalidades. En el ejemplo de código siguiente se usa un Main
método para representar el punto de entrada del programa. De este modo, puede declarar un record
tipo que precede al punto de entrada en el código. Presione el botón "Ejecutar" en el código siguiente para reemplazar el ejemplo existente por el código siguiente.
Advertencia
No copie y pegue. La ventana interactiva debe restablecerse para ejecutar el ejemplo siguiente. Si comete un error, la ventana se bloquea y necesita actualizar la página para continuar.
El código siguiente declara y usa un record
tipo para representar un Point
y, a continuación, usa esa Point
estructura en el Main
método :
public record Point(int X, int Y);
public static void Main()
{
Point pt = new Point(1, 1);
var pt2 = pt with { Y = 10 };
Console.WriteLine($"The two points are {pt} and {pt2}");
}
La record
declaración es una sola línea de código para el Point
tipo que almacena los valores X
y Y
en las propiedades de solo lectura. Puedes usar el nombre Point
siempre que utilices ese tipo. Los tipos con nombre correctos, como Point
, proporcionan información sobre cómo se usa el tipo. El Main
método muestra cómo usar una with
expresión para crear un nuevo punto que sea una copia modificada del punto existente. La línea pt2 = pt with { Y = 10 }
dice "pt2
tiene los mismos valores que pt
excepto que Y
se asigna a 10". Puede agregar cualquier número de propiedades para cambiar en una sola with
expresión.
La declaración anterior record
es una sola línea de código que termina en ;
, como todas las instrucciones de C#. Puede agregar comportamiento a un record
tipo declarando miembros. Un miembro de un registro puede ser una función o contener más elementos de datos. Los miembros de un tipo se encuentran en la declaración de tipo, entre {
caracteres y }
. Reemplace la declaración de registro que realizó por el código siguiente:
public record Point(int X, int Y)
{
public double Slope() => (double)Y / (double)X;
}
A continuación, agregue el código siguiente al Main
método después de la línea que contiene la with
expresión:
double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");
Ha agregado formalidad a la tupla que representa un valor de X
y de Y
. Lo ha convertido en un record
que definió un tipo con nombre e incluyó un miembro para calcular la pendiente. Un tipo record
es una abreviación de un objeto record class
: un tipo class
que incluye un comportamiento adicional. También puede modificar el Point
tipo para que sea así record struct
:
public record struct Point(int X, int Y)
{
public double Slope() => (double) Y / (double) X;
}
Un record struct
es un struct
tipo que incluye el comportamiento adicional agregado a todos los record
tipos.
Tipos de interfaz, clase e estructura
Todos los tipos con nombre en C# son tipos class
o struct
. A class
es un tipo de referencia. A struct
es un tipo de valor. Las variables de un tipo de valor guardan el contenido de la instancia de forma directa en la memoria. En otras palabras, un record struct Point
almacena dos enteros: X
y Y
. Las variables de un tipo de referencia almacenan una referencia o puntero a la memoria de la instancia. En otras palabras, un record class Point
almacena una referencia a un bloque de memoria que contiene los valores de X
y Y
.
En la práctica, esto significa que los tipos de valor se copian cuando se asignan, pero una copia de una instancia de clase es una copia de la referencia. Esa referencia copiada hace referencia a la misma instancia de un punto, con el mismo almacenamiento para X
y Y
.
El modificador record
indica al compilador que escriba varios miembros en su lugar. Puede obtener más información en el artículo sobre los tipos de registro de la sección aspectos básicos.
Al declarar un record
tipo, declara que el tipo debe usar un conjunto predeterminado de comportamientos para comparaciones de igualdad, asignación y copiación de instancias de ese tipo. Los registros son la mejor opción cuando almacenar datos relacionados es la responsabilidad principal de su tipo. A medida que agrega más comportamientos, considere la posibilidad de usar struct
o class
tipos, sin el record
modificador .
Tú utilizas tipos struct
para tipos de valor cuando se necesita un comportamiento más sofisticado, pero la responsabilidad principal es almacenar valores. Se utilizan class
tipos para aplicar conceptos orientados a objetos como la encapsulación, la herencia y el polimorfismo.
También puede definir interface
tipos para declarar contratos de comportamiento que distintos tipos deben implementar. Tanto struct
como class
pueden implementar interfaces.
Normalmente se usan todos estos tipos en programas y bibliotecas más grandes. Una vez instalado el SDK de .NET, puede explorar esos tipos mediante tutoriales sobre las clases de la sección aspectos básicos.
Ha completado el tutorial interactivo "Crear tipos en C#". Puede seleccionar el vínculo Ramas y bucles para iniciar el siguiente tutorial interactivo, o bien puede visitar el sitio de .NET para descargar el SDK de .NET, crear un proyecto en la máquina y mantener la codificación. La sección "Pasos siguientes" lo conduce de nuevo a estos tutoriales.
Puede obtener más información sobre los tipos de C# en los artículos siguientes: