Compartir a través de


Creación de tipos en C#

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 Pointy, 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: