1. Cómo funciona la memoria
Cada ordenador tiene memoria RAM. ¿Qué es esto, qué propiedades tiene y, lo más importante, ¿para qué nos sirve?
Cada programa (incluidos los escritos en C#) se carga en la memoria RAM antes de ejecutarse. En la memoria RAM está el código del programa (que ejecuta el procesador) y los datos del programa (que el propio programa coloca en la memoria).
¿Qué es la memoria RAM y a qué se parece?
Imagínate Excel 😎 Una hoja de Excel está formada por celdas, y cada celda tiene su número único (A1, A2, ... B1, B2). Sabiendo el número de la celda, siempre puedes escribirle un valor o leer el valor que hay ahí. La memoria del ordenador funciona de forma parecida.

El programa y sus datos, mientras se ejecutan, se almacenan en la memoria. Toda la memoria del ordenador está representada como pequeñas celdas – bytes. Cada celda tiene su número único – 0, 1, 2, 3, ...; (la numeración empieza desde cero). Sabiendo el número de la celda, podemos guardar datos en esa celda. O cogerlos de ahí. En unas celdas se guarda el código del programa – un conjunto de instrucciones para el procesador, en otras – los datos del programa. Al número de la celda también se le llama dirección de la celda.
El procesador sabe ejecutar instrucciones del programa cargado en memoria. Casi todas las instrucciones del procesador son algo como: coger datos de algunas celdas → hacer algo con ellos → poner el resultado en otras celdas.
Combinando cientos de instrucciones simples, conseguimos instrucciones complejas y útiles.
Cuando en el código del programa se declara una variable, se le asigna un trozo de memoria que aún no se ha usado. Normalmente son varios bytes. Al declarar una variable, siempre hay que indicar el tipo de información que el programa va a guardar ahí: números, texto u otros datos. Porque sin saber el tipo de información, no está claro de qué tamaño debe ser el bloque de memoria para la variable.
En los inicios de la informática, los programas trabajaban simplemente con los números de las celdas de memoria, pero luego, para comodidad de los programadores, se les empezó a dar nombres a las celdas. El nombre único de la variable es sobre todo para la comodidad de los programadores: el programa en sí podría funcionar perfectamente solo con los números.
2. Variables en la memoria
En C# hay 4 tipos de datos principales para guardar números enteros. Son byte, short, int y long.
| Tipo | Tamaño, bytes | Origen del nombre |
|---|---|---|
| byte | 1 | Byte, porque ocupa un byte de memoria |
| short | 2 | Abreviatura de Short Integer |
| int | 4 | Abreviatura de Integer |
| long | 8 | Abreviatura de Long Integer |
También en C# hay 2 tipos de coma flotante — float y double:
| Tipo | Tamaño, bytes | Origen del nombre |
|---|---|---|
| float | 4 | Abreviatura de Floating Point Number |
| double | 8 | Abreviatura de Double Float |
Cada vez que el programa ejecuta una instrucción para crear una variable, se le asigna una pequeña zona de memoria (el tamaño depende del tipo de variable).
int a = 10;
La dirección de una variable se considera la dirección de la primera celda del bloque de memoria asignado para ella.
A los programas en C# no se les permite acceder directamente a la memoria. Todo el trabajo con la memoria ocurre bajo el estricto control de C# y .NET.
3. El tipo string en la memoria
El tipo string puede almacenar grandes cantidades de datos, así que no es solo un tipo de datos, sino un objeto completo.
Los datos del tipo string (el texto) se colocan en un objeto especial, para el cual se asigna memoria, y la dirección de ese objeto se guarda en la variable, para la cual también se asigna memoria.

- La variable a de tipo int ocupa 4 bytes y guarda el valor 1.
- La variable b de tipo int ocupa 4 bytes y guarda el valor 10,555. La coma aquí no es la parte decimal, sino la separación de miles. La parte decimal se separa con un punto.
- La variable d de tipo double ocupa 8 bytes y guarda el valor 13.001.
- La variable str de tipo string ocupa 4 bytes y guarda el valor D12 — la dirección de la primera celda del objeto que contiene el texto.
El objeto de tipo string (que contiene el texto) se guarda en un bloque de memoria aparte. La dirección de su primera celda se guarda en la variable str.
4. ¿Qué pasa cuando asignamos?
Otra cosa importante — cómo funciona la asignación. Por ejemplo:
int a = 10;
int b = a;
b = 20;
Console.WriteLine(a); // 10
En este ejemplo se crean dos celdas en la memoria: una para a, otra para b. Cuando escribimos b = a;, se copia el valor (10), no la "caja" en sí. Cambios en b no afectan a a.
Ahora lo mismo, pero con strings:
string s1 = "Hola";
string s2 = s1;
s2 = s2 + " Mundo";
Console.WriteLine(s1); // "Hola"
Console.WriteLine(s2); // "Hola Mundo"
Aquí ambas variables s1 y s2 apuntan a la misma cadena "Hola" hasta el momento de la modificación. Pero cuando hacemos s2 = s2 + " Mundo", para s2 se crea una nueva cadena "Hola Mundo", y s1 sigue apuntando a la cadena antigua "Hola".
5. ¿Por qué en programación todo se numera desde cero?
La gente a menudo se sorprende de por qué en programación casi siempre se empieza a contar desde cero. El caso es que hay muchas situaciones en las que contar desde cero es más cómodo (aunque también hay situaciones donde es más cómodo contar desde 1).
La situación más simple de este tipo es la direccionamiento de memoria. Si a tu variable le han asignado 4 bytes de memoria y tienes X – la dirección del primer byte, ¿cuáles serán las direcciones de todos los bytes? X+0, X+1, X+2, X+3. Así ya tenemos un grupo de bytes con índices 0, 1, 2, 3.
Cuando pensamos en la dirección relativa dentro de un bloque de datos, siempre obtenemos numeración desde cero. Esa es la primera y más común razón para contar desde cero.
GO TO FULL VERSION