En términos generales, si analizamos lenguajes como C, C++ y C#, notarás esta característica:
- Un programa en C es un conjunto de funciones y tipos de datos
- Un programa en C++ es un conjunto de funciones y clases
- Sin embargo, la esencia de un programa C# consiste en un conjunto de declaraciones de tipos
El código fuente de cualquier archivo ejecutable de C# (EXE) o biblioteca de enlace dinámico (DLL) está formado por una o varias declaraciones de tipos.
Los archivos DLL no tienen punto de entrada Main; mientras que un ejecutable (EXE) debe declarar al menos una clase que contenga un método llamado Main, el punto de arranque del programa.
Un software de gran tamaño puede albergar miles de tipos (clases, etc.) en su código fuente. Los proyectos grandes suelen ser desarrollados por varios programadores, cada uno encargado de módulos distintos, por lo que es casi inevitable que aparezcan tipos con nombres iguales. ¿Cómo evitamos conflictos de nombres? Aquí entran en juego los «espacios de nombres» que comentamos antes.
El espacio de nombres (namespace) sirve para agrupar declaraciones de tipos relacionadas y asignar un identificador común a todo ese grupo. Como cualquier programa es básicamente una colección de tipos interconectados, los desarrolladores suelen crear espacios de nombres personalizados para albergar todos los tipos del proyecto.
En resumen, un espacio de nombres añade una etiqueta de grupo a un conjunto de clases. Si otro fragmento de código quiere acceder a esas clases, debe incluir dicha etiqueta de grupo.
Imagina una clase con dos alumnos que comparten el mismo nombre completo. Los profesores y compañeros no pueden diferenciarlos solo por su nombre, así que añaden una referencia de grupo: por ejemplo, Tom del Grupo A y Tom del Grupo B. Las etiquetas A y B cumplen la misma función que los espacios de nombres.
El código que verás a continuación muestra un programa con tres declaraciones de tipos, todos definidos dentro de un espacio de nombres llamado MyProgram.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloDemo // Declarar un espacio de nombres
{
class A // Declarar el tipo A (clase)
{
void Fun1() // Función
{
// Lógica del programa
}
}
class B // Declarar el tipo B (clase)
{
void Fun1() // Función
{
// Lógica del programa
}
}
class C // Declarar el tipo C (clase)
{
static void Main(string[] args) // Punto de entrada Main del programa
{
double pi = 3.14;
string webSite = "foxdevelop.com";
Console.WriteLine($"The Pi is {pi} and the website is {webSite}.");
}
}
}
Lenguaje del código: PHP (php)
Profundizaremos en los espacios de nombres en las próximas lecciones.
El tipo es una plantilla
Dado que un programa C# es esencialmente un conjunto de declaraciones de tipos, aprender C# consiste en dominar la creación y el uso de tipos. Lo primero que debemos comprender es:
Qué es un Tipo (Type)
Puedes entender un tipo como una plantilla para crear estructuras de datos: no es una estructura de datos concreta en sí misma, pero define todas las propiedades que tendrán los objetos generados a partir de esta plantilla.
Un tipo no es más que un «plano de diseño» que no consume memoria por sí solo; solo se asigna memoria y se almacenan datos cuando se instancia.
El tipo es un plano para generar objetos reales. Es similar al plano de una casa: con un único plano se pueden construir muchas viviendas independientes.
Cada tipo se define mediante tres elementos:
- Nombre
- Estructura para almacenar los datos de sus miembros
- Comportamientos y restricciones
En C# todo es un tipo, incluidos los tipos primitivos integrados.
Aquí tienes dos ejemplos de tipos integrados: short e int.
Su estructura es la siguiente:
| Tipo short | Tipo int |
|---|---|
| Nombre: short | Nombre: int |
| Estructura: ocupa 2 bytes | Estructura: ocupa 4 bytes |
| Comportamiento: entero de 16 bits | Comportamiento: entero de 32 bits |
- Nombre: identificador único del tipo (
int/string/nombres de clases personalizadas) - Estructura de almacenamiento: define el tamaño de memoria y la disposición de campos (ej:
shortocupa siempre 2 bytes) - Restricciones de comportamiento: especifica operaciones válidas, rango de valores y métodos nativos (ej:
intsoporta operaciones aritméticas, rango de valores-2^31 ~ 2^31-1)
Instanciación (Instantiate)
Crear un objeto de datos utilizable a partir de una plantilla de tipo con la palabra reservada new
Objeto (object) = Instancia (instance)
Tomemos como ejemplo los tipos int y short vistos antes: podemos generar instancias a partir de ellos. En el código inferior, pi, age y nums son instancias creadas a partir de los tipos double, int y short respectivamente.
namespace HelloDemo
{
class Program
{
static void Main(string[] args)
{
double pi = 3.14;
int age = 12;
short nums = 23;
}
}
}Lenguaje del código: JavaScript (javascript)
En C#, todas las variables y datos del programa son, sin excepción, instancias de algún tipo; no existen datos sin tipo asociado.
Consulta el ejemplo anterior
La clase C del ejemplo es la clase de punto de entrada y cumple todos los requisitos de un archivo ejecutable:
- Es un tipo personalizado contenido en el espacio de nombres
MyProgram - Contiene el método estático sin retorno
Main, que funciona como punto de inicio de la aplicación
En C# no solo existe el tipo class
Todos los tipos declarables en C#: Clase (class), Estructura (struct), Interfaz (interface), Enumeración (enum), Delegado (delegate), Registro (record)
BCL (Base Class Library): Biblioteca de clases estándar integrada de .NET, que proporciona tipos predefinidos del sistema como int, short, string, List<T>, los cuales el desarrollador puede instanciar y usar directamente.
Declaración de tipo